awk - 여러 줄 컨텍스트 이후 변경

awk - 여러 줄 컨텍스트 이후 변경

Line3특정 처음 두 줄의 컨텍스트 이후 에만 변경하면 됩니다 .
구체적인 맥락은 다음과 같습니다:

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여러 줄 컨텍스트에 직접 액세스할 수 있도록 전체 파일을 흡수합니다. 이 솔루션은 기가바이트 파일에는 피해야 합니다.)

관련 정보