AWK は、最初の一致後に行を挿入するか、次の行がパターンでない場合は空行を挿入します。

AWK は、最初の一致後に行を挿入するか、次の行がパターンでない場合は空行を挿入します。

変更ログに似た次のファイルがあります

#1.2.3

#InsertPart

#1.2.2

または

#1.2.3

#InsertPart

- something

#1.2.2

希望の出力は

#1.2.3

#InsertPart

- new inserted line

#1.2.2

または

#1.2.3

#InsertPart

- new inserted line
- something

#1.2.2

次のスクリプトを使用して、#InsertPartの後に行を挿入できます。

awk '1;!inserted && /# InsertPart/{c=2}c && !--c{print "- new inserted line"; inserted=1}'

#x.x.xしかし、私はパターンが次の行にあるときにのみ空の行を挿入する必要があると主張します。だから私は次のような結果を得ます:

#1.2.3

#InsertPart

- new inserted line
#1.2.2

答え1

私の考えでは、問題は最初に行を印刷してから挿入を実行し、次に行を印刷するのではなく別の操作を実行することを決定することです。

マジックタグの後に新しい内容を2行挿入し、行がで始まる場合には、間に空行も追加したいと思います#

awk '/#InsertPart/ { c = 3 }
     --c == 0 { print "- new inserted line" }
     c == 0 && /^#/ { print "" }
     {print $0}'

より明確にするために、最も短い方法(「1」ではなく「{print $ 0}」など)ではなく、直接的な方法でコードを作成しました。 cを減らし、--c == 0cの新しい値を0と比較します。

答え2

この試み

awk -v line='- new inserted line' '/#InsertPart/ {printf "%s\n\n%s\n", $0, line; next}; 1' yourfilename

関連情報