2015-04-15 21 views
2

假设我们有以下内容的文件:如何从使用sed的匹配开始的文件中删除所有行?

alpha 
beta 
keyword 
gamma 
phi 

什么是sed命令,看起来对“关键词”模式匹配,然后删除所有行?输出将是:

alpha 
beta 

类似的命令,sed -n -e '1,/^keyword/p',几乎工作,但保留在输出的“关键字”行。

回答

2
$ sed -n '/keyword/q;p' file 
alpha 
beta 

一些替代品可以考虑使用一个更加统一的方法来控制什么获取印刷前/包括/排除关键字后:

$ awk '/keyword/{f=1} !f' file # = sed -n '/keyword/q;p' file 
alpha 
beta 

$ awk '!f; /keyword/{f=1}' file # = sed -n 'p;/keyword/q' file 
alpha 
beta 
keyword 

$ awk '/keyword/{f=1} f' file # = sed -n '/keyword/,$p' file 
keyword 
gamma 
phi 

$ awk 'f; /keyword/{f=1}' file # = sed -n '1,/keyword/{d};p' file 
gamma 
phi 

以上awk脚本始终只是设置一个标志,当关键词被发现并且您可以控制在测试关键字之前或之后通过测试是否设置标志来打印的内容。

另一方面,sed脚本必须将第二版和第三版之间的样式从简单的测试/打印转换为范围表达式,并为第三和第四个脚本与前两个脚本引入不同的字符/语法。

另请参阅Printing with sed or awk a line following a matching pattern了解更多围绕正则表达式打印范围的解决方案。

+1

你也可以反转这个并执行'sed'/ keyword /,$ d'file',但我认为这对于这个任务来说效率严格低。 –

+0

与GNU sed:'sed'/关键字/ Q'文件' – Cyrus

+0

@EtanReisner,你会介意解释为什么它效率会降低吗? –

相关问题