我使用下面的“sed”命令在文件中每次匹配模式后删除“N”行。
sed -i '/test/,+1d' file.txt
假设我在名为 file.txt 的文件中有一个模式“test”。我想删除单词“test”第二次出现后的两行。有没有 sed/awk 单行程序可以实现这个功能?
例如:file.txt
test
apple
mango
test
brinjal
carrot
test
banana
gauva
答案1
删除第二行test
及其后一行:
$ awk '/test/ && ++f == 2 {getline;next} 1' file.txt
test
apple
mango
carrot
test
banana
gauva
怎么运行的:
/test/ && ++f == 2 {getline;next}
每当我们遇到与正则表达式匹配的行时
test
,我们都会增加变量f
,如果是f==2
,我们用 读入另一行getline
,然后跳转到该next
行重新开始。这会丢弃该test
行和下一行。1
对于所有其他行,我们都打印该行。(
1
是 awk 中 print-the-line 的简写。)
备用
test
在这种方法中,我们捕获变量中第二次出现的行匹配的行号N
。
N
仅当尚未分配或当前行至少位于行号之后 2 行时,我们才会打印一行N
。
$ awk '/test/ && ++f == 2 {N=NR} (!N) || NR>=N+2' file.txt
test
apple
mango
carrot
test
banana
gauva