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