Awk:根据下一行更改行

Awk:根据下一行更改行

如何使用 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

相关内容