使用 sed/awk 命令仅在文件中第 N 次出现某个模式时删除‘N’行

使用 sed/awk 命令仅在文件中第 N 次出现某个模式时删除‘N’行

我使用下面的“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

怎么运行的:

  1. /test/ && ++f == 2 {getline;next}

    每当我们遇到与正则表达式匹配的行时test,我们都会增加变量f,如果是f==2,我们用 读入另一行getline,然后跳转到该next行重新开始。这会丢弃该test行和下一行。

  2. 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

相关内容