限制sed仅删除单个匹配行

时间:2014-10-29 08:15:43

标签: regex bash sed

我的目标非常简单。给定一个包含数据的文件:

$ cat yes
ayaz
khan
ayaz
ahmed
ayaz
something
ayaz

我希望使用sed删除与表达式ayaz匹配的第一行。 (当然,这是样本数据,在实际数据中,表达式的第一次出现可以在任何给定的行上,而不仅仅是第一次出现。我希望删除第一次出现的表达式的行。

但是,对于sed,我无法弄清楚如何在匹配和删除第一个匹配项后告诉sed放弃。

$ sed '/ayaz/d' yes
khan
ahmed
something

我看过无数的例子,除非一直忽视它,否则无法找到办法。任何有用的指针将不胜感激。

谢谢!

4 个答案:

答案 0 :(得分:4)

试试这个:

sed '0,/ayaz/{/ayaz/d}' yes

答案 1 :(得分:3)

这是另一个awk(甚至比sed更短),并且应该适用于大多数系统。

awk '!/ayaz/||f++' yes
khan
ayaz
ahmed
ayaz
something
ayaz

答案 2 :(得分:2)

使用awk更简单:

awk '!p && /ayaz/{p=1;next}1' file
khan
ayaz
ahmed
ayaz
something
ayaz

答案 3 :(得分:1)

sed可能适用于非gnu sed,但会留下一个空行:

sed '/ayaz/{s///;:a;n;ba}' yes

khan
ayaz
ahmed
ayaz
something
ayaz

gnu sed的较短版本(但仍长于我的awk

sed '0,/ayaz/{//d;}' yes
khan
ayaz
ahmed
ayaz
something
ayaz

另一个版本(在我的busybox系统上无效):

sed 'x;/./{x;b};x;/ayaz/{h;d}' yes
khan
ayaz
ahmed
ayaz
something
ayaz