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