awk - 複数行のコンテキスト以降の変更

awk - 複数行のコンテキスト以降の変更

Line3特定の最初の2行のコンテキスト以降にのみ変更できます。
具体的な文脈は次のとおりです。

Line2
LineEXTRA

ファイルに次のものが含まれています

Line1
Line2
Line3
-----
Line1
Line2
LineEXTRA
Line3
-----
Line1
Line2
Line3

このファイルに

Line1
Line2
Line3
-----
Line1
Line2
LineEXTRA
LineNEW
-----
Line1
Line2
Line3

私たちの試み

awk '/Line2/ { 
   print; getline; if ($0 ~ /Line3/) sub(/3/,"NEW")
}
{ print }' file

結果

Line1
Line2
LineNEW
-----
Line1
Line2
LineEXTRA
Line3
-----
Line1
Line2
LineNEW

それは私たちが望むものではありません。

他の試みはまったく機能しませんでした。

awk '/Line2\nLineEXTRA/ { 
   print; getline; if ($0 ~ /Line3/) sub(/3/,"NEW")
}
{ print }' file

答え1

このコードは希望の出力を提供します

awk '/Line2/ { 
   print; getline; if ($0 == "LineEXTRA"){print;getline; sub(/3/,"NEW")}
}
{ print }' file

答え2

@Dababiの答えは完璧です。

gnu-sedの別の亜種

sed -zr 's/(Line2\nLineEXTRA\nLine)3/\1NEW/g' ex

sed -z複数行のコンテキストに直接アクセスできるようにファイル全体を吸収します。このソリューションはギガバイトファイルには避けてください。)

関連情報