我可以使用 sed 仅删除第一个匹配的行吗?

我可以使用 sed 仅删除第一个匹配的行吗?

我有一个testfile.txt包含

pippo=x
pluto=y
1234=z

我只想删除首先行匹配/^[a-z]\+=/(本例中为第一行)。

我尝试使用以下命令,但没有成功:

sed   '/^[a-z]\+=/,+0d' testfile.txt

但第一个行被删除。

有没有办法用来完成这项任务sed

问候

答案1

sed你的命令有问题

$ sed '/^[a-z]\+=/,+0d' testfile.txt

sed脚本应用于每一个输入数据的行。

(这+0是 GNU 扩展)意味着你的脚本相当于

$ sed '/^[a-z]\+=/d' testfile.txt

正如您所注意到的,第一行和第二行将被删除。

顺便说一句,你会得到完全相同的影响使用+1,但出于其他原因。d由于第一行匹配,该命令将应用于前两行,而不是分别应用于第一行和第二行(即命令的范围d将是第一行和第二行,+1)。这不会删除第三行,因为它超出了范围。

GNUsed解决方案

$ sed '0,/^[a-z]\+=/{//d}' testfile.txt

用户@Whitefield 发布的内容有效并且相当不错(尽管如果您想要更符合 POSIX-ish,该-r选项是不必要的,并且在这种情况下0可以将起始地址更改为)。1

sed相同方法的BSD版本如下所示

$ sed '1,/^[a-z]+=/{/^[a-z]+=/d
  }' testfile.txt

+仅当您sed实现的是“过时的基本正则表达式”而不是“现代基本正则表达式”时,才需要转义。我的系统 (Mac OS X) 上的 BSDsed和 GNUsed似乎都属于“现代”类型。POSIX 没有这种区别,同时阅读手册(re_format(7)关于 BSD,有这种区别)和 POSIX 规范让我头晕目眩。

答案2

@John1024 很抱歉,但只有当第一个匹配的行是文件的第一行时,您的解决方案才有效。

我使用以下代码解决了该问题sed -r '0,/^[a-z]\+=/{//d;}' testfile.txt,但我仍然相信我之前的解决方案即使使用 posix sed 也应该有效。

事实上,这个想法是将第二行地址的偏移量设为 0 行...但它仍然会删除下一行,这听起来像是一个错误。

来自man sedubuntu 14.04

... addr1,+N 将匹配 addr1 以及 addr1 后面的 N 行。...

相关内容