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

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

次の内容を含む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

答え2

別のPerlアプローチ:

$ perl -ne 'print /^\*[^*]*$/ && $. > 1 ? "\n$_" : "$_"' file
* header A  
- item 1  
- item 2   

* header B  
- item 1  
- item 2  

* header C  
- item 1  
- item 2 

これは、最初の行で始まり、最初の行以外の場所を*含まないすべての行の前に改行文字を印刷します。*

答え3

考えられる解決策の1つは、awk次のことを行うことです。

 awk '/^*/ { if (FNR!=1) printf "\n"} {print $0}' <input file>

アイデアは、次に始まるレコードを検索して、*これが最初のレコードではないことを確認することです。両方の条件が満たされると、空白行が印刷されます。次に、入力行を印刷します。

説明に記載されている単純化されたバージョン:

awk 'FNR > 1 && /^*/ {printf "\n"} 1'

*PSスクリプトはファイルの最初の場所にのみ問題はありません。

答え4

編集スクリプトを使用して、行2から始まり、ed文字列で始まる各行に空の行を挿入します。*

2,$ g/^* / i \
\
.

このコマンドは、g2行目から最後の行()までのすべての$行に適用され、i正規表現に一致する行の前に空の行を追加する(「挿入」)コマンドを適用します^*。行の先頭でゼロ以外の数字を^*\**一致させるには、ORを使用します。^*\{1,\}*

命令iが少し変に見えますが、

i

.

(つまり、空の行を挿入する)ただし、コマンドを介して実行するため、最後の行を除くすべての行から改行をエスケープする必要がありますg

で始まる行の検索を開始せずに代わり*に始まる行の検索を開始するには、*コマンドでを変更して2最初の*行をスキップできます(例:)/^* /+1

指定されたデータに対して実行し、いくつかの追加コマンドを使用して変更されたバッファを印刷して保存せずに終了します。

$ printf '%s\n' '2,$ g/^* / i\' '\' . ,p Q | ed -s file
* header A
- item 1
- item 2

* header B
- item 1
- item 2

* header C
- item 1
- item 2

,pに変更すると、変更されwたバッファは元のファイルに書き戻されます。


同様の解決策は以下を使用しますsed

sed -e 1b -e '/^* / i\

' file

...またはGNUを使用してくださいsed

sed -e 1b -e '/^* / i \\' file

指定されたタグに分岐b(ジャンプ)するか、タグがない場合はスクリプトの末尾に分岐します。ここでは、最初の行で明示的に何もしないために使用します。次に、で始まるすべての行の前に空白行を追加する挿入コマンドを適用します*

関連情報