我有一个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 sed
ubuntu 14.04
... addr1,+N 将匹配 addr1 以及 addr1 后面的 N 行。...