【发布时间】:2015-04-15 18:33:27
【问题描述】:
假设我们有一个包含以下内容的文件:
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
$ 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 脚本必须将第 2 和第 3 版本之间的样式从简单的测试/打印更改为范围表达式,并为第 3 和第 4 脚本与前 2 个脚本引入不同的字符/语法。
另请参阅Printing with sed or awk a line following a matching pattern,了解更多打印正则表达式范围的解决方案。
【讨论】:
sed '/keyword/,$d' file,但我认为这对于这项任务来说效率很低。
sed '/keyword/Q' file
/keyword/ 匹配,并且一旦匹配,它就会退出处理输入文件并退出。反转同样需要将每一行与/keyword/ 匹配,但一旦看到它,它就会继续读取文件的其余部分,检查每一行是否是文件中的最后一行。所以它只处理比原始数据更多的数据。