我的目标非常简单。给定一个包含数据的文件:
$ cat yes
ayaz
khan
ayaz
ahmed
ayaz
something
ayaz
我希望使用sed
删除与表达式ayaz
匹配的第一行。 (当然,这是样本数据,在实际数据中,表达式的第一次出现可以在任何给定的行上,而不仅仅是第一次出现。我希望删除第一次出现的表达式的行。)
但是,对于sed
,我无法弄清楚如何在匹配和删除第一个匹配项后告诉sed
放弃。
$ sed '/ayaz/d' yes
khan
ahmed
something
我看过无数的例子,除非一直忽视它,否则无法找到办法。任何有用的指针将不胜感激。
谢谢!
答案 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