2
假设我们有以下内容的文件:如何从使用sed的匹配开始的文件中删除所有行?
alpha
beta
keyword
gamma
phi
什么是sed命令,看起来对“关键词”模式匹配,然后删除所有行?输出将是:
alpha
beta
类似的命令,sed -n -e '1,/^keyword/p'
,几乎工作,但保留在输出的“关键字”行。
假设我们有以下内容的文件:如何从使用sed的匹配开始的文件中删除所有行?
alpha
beta
keyword
gamma
phi
什么是sed命令,看起来对“关键词”模式匹配,然后删除所有行?输出将是:
alpha
beta
类似的命令,sed -n -e '1,/^keyword/p'
,几乎工作,但保留在输出的“关键字”行。
$ 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了解更多围绕正则表达式打印范围的解决方案。
你也可以反转这个并执行'sed'/ keyword /,$ d'file',但我认为这对于这个任务来说效率严格低。 –
与GNU sed:'sed'/关键字/ Q'文件' – Cyrus
@EtanReisner,你会介意解释为什么它效率会降低吗? –