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吸收整个文件,因此我们可以直接访问多行上下文。对于千兆字节文件应避免使用此解决方案)

相关内容