特定の文字を含む各行の前に空白行を追加します。

特定の文字を含む各行の前に空白行を追加します。

次の内容を含むMarkdownファイルがたくさんあります。

* header A  
- item 1  
- item 2
** sub-header A1
** sub-header A2   
* header B  
- item 1  
- item 2  
** sub-header B1
** sub-header B2  
* header C  
- item 1  
- item 2 
** sub-header C1
** sub-header C2  

内容が次のように見えるように変更したいと思います。

* header A  
- item 1  
- item 2
** sub-header A1
** sub-header A2   

* header B  
- item 1  
- item 2  
** sub-header B1
** sub-header B2  

* header C  
- item 1  
- item 2 
** sub-header C1
** sub-header C2  

したがって、デフォルトでは、スクリプトは単一のファイルを処理し、アスタリスクのみを含む最初の行を除くすべての行の前に新しい行を追加する必要があります。

また、2番目のスクリプトが最初のスクリプトとほぼ同じであることを望んでいますが、必要な数だけアスタリスクのある行を一致させるには、次のようにします。

* header A  
- item 1  
- item 2
** sub-header A1
** sub-header A2   
* header B  
- item 1  
- item 2  
** sub-header B1
** sub-header B2  
* header C  
- item 1  
- item 2 
** sub-header C1
** sub-header C2  

私はそれを次のように変更したいと思います:

* header A  
- item 1  
- item 2

** sub-header A1

** sub-header A2
   
* header B  
- item 1  
- item 2  

** sub-header B1

** sub-header B2  

* header C  
- item 1  
- item 2 

** sub-header C1

** sub-header C2  

ベストアンサー1

そしてperl

perl -i -ple 'print "" if $. > 1 && /^\s*\*(\*+|[^*]*)\s*/' your-file

空白の数に関係なく、最初の行を除く最初の行の前に空白行を印刷してから*1つ以上の空白行を印刷する*か、*最後に空白が許可されるまで追加行を印刷しません。したがって、複数の行で構成される行、または*1つだけで始まる行(オプションで空白が前に来て後に何も来ることはできません)があります。*

-iファイルを所定の位置に編集するために使用されます。

複数のファイルを処理する場合は、各ファイルを処理するたびに1にリセットするclose ARGV if eof必要があります$.

perl -i -ple '
  print "" if $. > 1 && /^\s*\*(\*+|[^*]*)\s*/;
  close ARGV if eof' ./*.md

おすすめ記事