パターンマッチング後に次のレコードを置き換え(または修正)するには?前任者:
1
2
3 blah
4 replace this record
5 blah
6 replace this record
7
8
9
ここでは、前のレコードが「多分」の場合、4番目と6番目のレコードをスキップまたは置き換えたいと思います。
答え1
これは次の行を置き換えますblah
。
$ awk 'f{$0="replacement"; f=0} /blah/{f=1} 1' file
1
2
3 blah
replacement
5 blah
replacement
7
8
9
どのように動作しますか?
f{$0="replacement"; f=0}
true
f
(0 以外) の場合、行は置き換えられ、f
0 にリセットされます。/blah/{f=1}
この行が正規表現と一致する場合はtrueに
blah
設定されます。f
1
これはawkのフルライン印刷の秘密の略語です。
答え2
sed
代わりにGNUを使用してくださいawk
:
sed -e '/blah/{ n; c\' -e 'replacement' -e '}' file
パターンに一致する行を見つけますblah
。そのような行が見つかると印刷され、n
次の入力行もすぐに読み取られます。これにより、次の行がc
代替テキストに変わります。代替テキストはループの末尾に印刷されます。
注釈付きsed
スクリプト:
/blah/ { ;# this is a "blah" line
n ;# output line and read next line
# change the line just read
c\
replacement
}
# (implicitly print all lines)
sed
このスクリプトはOpenBSDとNetBSDでも機能しているようですが、一番上の1行のコードはコマンドエラーのためにこれらの実装では機能しないようです。sed
c
答え3
$ awk '/blah/ {print $0 "\n" "replacement"; getline; next} 1' file
現在の行が一致する場合は、blah
印刷してreplacement
新しい行に印刷し、次の出力行(「replace」に置き換え)を取得します。何もしないでくださいを選択し、残りのルールをスキップします。 「残りの規則」(一致しない行と一致しない行にのみ適用blah
)フォローする線が多分一致します)単に線を印刷します。