パターンの後の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
答え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
- ファイルをディスクに書き戻して終了します。