如何使用 awk 修改与特定模式匹配的行,但前提是下一行与另一个模式不匹配?
以这个片段为例:
....
pattern1 100 200 300
pattern1 300 400 400
pattern2 300 900 700
pattern1 200 500 900
...
我想修改包含 的所有行pattern1
,但第二行除外,后跟包含 的行pattern2
。
这类似于这个问题,但恰恰相反。
答案1
尝试类似的东西
/pattern2/ { print intact ; print $0 ; next ;}
! /pattern2/ { print new ;}
{ intact=$0 ; $1="p1" ; new=$0 ; }
多了一个空行
结果是
p1 100 200 300
pattern1 300 400 400
pattern2 300 900 700
p1 300 400 400
答案2
这就是我所需要的:
/pattern1/ {
if (candidate) {
print "modify:", candidate
}
candidate=$0
next
}
/pattern2/ {
if (candidate) {
print candidate
candidate=0
}
}
{
if (candidate) {
print "modify:", candidate
candidate=0
}
print $0
}
答案3
sed -e '
/pattern1/!b
$q; N
/\npattern2/!s/^/MODIFIED:/
P;D
' yourfile
perl -0777pe 's/(?=pattern1.*$)(?!pattern2)/MODIFIED:/gm' yourfile