【问题标题】:Delete n lines after the first match in sed在 sed 中的第一个匹配后删除 n 行
【发布时间】:2020-08-20 14:47:36
【问题描述】:

我有一个包含以下内容的 file.txt

test 1
test 2
test 3
test 1
test 5
test 6

我想用 sed 删除“test 1”第一个匹配后的 2 行,所以 file.txt 的最终结果如下:

test 1
test 5
test 6

我知道我可以使用命令在匹配后删除 2 行

sed -i '/test 1/,+2d' file.txt

但这将适用于“test 1”的所有匹配项,并且生成的 file.txt 将为空。 如何仅在第一场比赛中执行此操作?

【问题讨论】:

  • 不要使用sed,使用更可编程的东西,例如awk
  • @Barmar 我也不介意使用 awk。知道如何制定命令吗?

标签: awk sed


【解决方案1】:

请使用awk

当你匹配第一个test 1时,设置一个变量并跳过带有getline的下N行。

设置变量后无条件打印该行。

awk -v nlines=2 '
    found {print; next} 
    /test 1/ { found = 1; for (i = 0; i < nlines; i++) getline }' file.txt

【讨论】:

  • 我的例子是一个最小的工作例子。如果我需要在第一次匹配后删除 150 行,是否有更简洁的方法来编写此命令?
  • 您可以将getline 调用放在for 循环中。 for (i = 0; i &lt; 150; i++) getline
【解决方案2】:

这是另一个awk,可以在不使用getline 的情况下完成这项工作:

awk -v n=2 -v s="test 1" '!d && $0 == s{d = FNR + n} FNR > d' file
test 1
test 5
test 6

您可以在命令行变量s 中传递您的模式,并在变量n 中传递想要删除的行数。

【讨论】:

    最近更新 更多