awk:パターンに続くN行の後に行を挿入する

awk:パターンに続くN行の後に行を挿入する

パターンの後の3行目に行を挿入したいです。例:z各一致の後に3行の単語を挿入します。a

~から

a 
b1
c1
d1


a 
b2
c2
d2

...

到着

a 
b1
c1
z
d1


a 
b2
c2
z
d2

...

答え1

$ awk '/a/{c=1} (c++)==4{print "z"} 1' file
a
b1
c1
z
d1


a
b2
c2
z
d2

答え2

またはsed 挿入/追加:

sed '/^a/{n;n;n;i\z
}' FILE
sed '/^a/{n;n;a\z
}' FILE

答え3

次の操作が実行されます。

awk 'BEGIN {v1=-100} {if ($1=="a") v1=FNR;if (FNR-v1==3) print "z"; print $0}' input_file

スクリプトはレコードが「a」であることを確認し、現在の行を指すように変数を設定します。次に、現在のレコード行から以前に保存された行を引いた値が3であることを確認し、文字列を印刷してから現在の行を印刷します。

答え4

edこれを行うには、スクリプト可能なエディタを使用できます。z一致の後に3行全体を挿入します/a/

$ ed -s input-file
g/a/+3i\
z
wq

または1行で:

printf '%s\n' 'g/a/+3i\' 'z' 'wq' | ed -s input-file

コマンドは次edのとおりです。

  • g/a/+3i\- 後続のコマンドを完全に実行します。つまり、/a/の後の3行を一致させ、いくつかのテキストを挿入します。末尾のバックスラッシュは、挿入コマンドを次の行に続けます。
  • z- テキストを挿入しますz。後続のバックスラッシュがないため、insert コマンドが終了し、グローバル実行が完了します。
  • wq- ファイルをディスクに書き戻して終了します。

関連情報