awkを使用してパターンマッチング後に次のレコードを置き換える方法

awkを使用してパターンマッチング後に次のレコードを置き換える方法

パターンマッチング後に次のレコードを置き換え(または修正)するには?前任者:

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 以外) の場合、行は置き換えられ、f0 にリセットされます。

  • /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行のコードはコマンドエラーのためにこれらの実装では機能しないようです。sedc

答え3

$ awk '/blah/ {print $0 "\n" "replacement"; getline; next} 1' file

現在の行が一致する場合は、blah印刷してreplacement新しい行に印刷し、次の出力行(「replace」に置き換え)を取得します。何もしないでくださいを選択し、残りのルールをスキップします。 「残りの規則」(一致しない行と一致しない行にのみ適用blahフォローする線が多分一致します)単に線を印刷します。

関連情報