如何使用 awk 进行模式匹配后替换下一条记录

如何使用 awk 进行模式匹配后替换下一条记录

如何在模式匹配后替换(或修改)下一条记录?前任:

1
2
3 blah
4 replace this record
5 blah
6 replace this record
7 
8
9

这里我想当前一条记录是“blah”时跳过或替换第四条记录和第六条记录

答案1

这替换了之后的行blah

$ awk 'f{$0="replacement"; f=0} /blah/{f=1} 1' file
1
2
3 blah
replacement
5 blah
replacement
7 
8
9

怎么运行的

  • f{$0="replacement"; f=0}

    如果f为真(非零),则替换该行并重置f为零。

  • /blah/{f=1}

    如果此行与 regex 匹配blah,则设置f为 true。

  • 1

    这是 awk 的 print-the-whole-line 的神秘简写。

答案2

使用 GNUsed而不是awk

sed -e '/blah/{ n; c\' -e 'replacement' -e '}' file

这将查找与模式匹配的线条blah。当找到这样的行时,会打印n,它也会立即读取下一行输入。然后,下一行将更改为c替换文本。替换文本在循环结束时打印。

带注释的sed脚本:

/blah/ {    ;# this is a "blah" line
    n       ;# output line and read next line
             # change the line just read
    c\
replacement
}
             # (implicitly print all lines)

尽管顶部的单行代码似乎由于命令错误而无法在这些实现中使用,但这个sed脚本似乎也可以在 OpenBSD 和 NetBSD 中使用。sedc

答案3

$ awk '/blah/ {print $0 "\n" "replacement"; getline; next} 1' file

如果当前行匹配,blah则打印它,replacement在新行上打印,获取下一行输出(我们已将其替换为“替换”)并不做任何事,然后跳过剩余的规则。 “剩余规则”(仅适用于不匹配blah且不匹配的行)跟随a line matches blah) 就是简单地打印该行。

相关内容