如何在模式匹配后替换(或修改)下一条记录?前任:
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 中使用。sed
c
答案3
$ awk '/blah/ {print $0 "\n" "replacement"; getline; next} 1' file
如果当前行匹配,blah
则打印它,replacement
在新行上打印,获取下一行输出(我们已将其替换为“替换”)并不做任何事,然后跳过剩余的规则。 “剩余规则”(仅适用于不匹配blah
且不匹配的行)跟随a line matches blah) 就是简单地打印该行。