【问题标题】:How to delete all lines from a file starting from a match using sed?如何使用sed从匹配开始的文件中删除所有行?
【发布时间】:2015-04-15 18:33:27
【问题描述】:

假设我们有一个包含以下内容的文件:

alpha
beta
keyword
gamma
phi

查找“关键字”模式匹配并删除其后所有行的 sed 命令是什么?输出将是:

alpha
beta

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

【问题讨论】:

    标签: sed


    【解决方案1】:
    $ 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,但我认为这对于这项任务来说效率很低。
    • 使用 GNU sed:sed '/keyword/Q' file
    • @EtanReisner,您介意解释一下为什么效率会降低吗?
    • @l'L'l 答案中的脚本需要将每一行与/keyword/ 匹配,并且一旦匹配,它就会退出处理输入文件并退出。反转同样需要将每一行与/keyword/ 匹配,但一旦看到它,它就会继续读取文件的其余部分,检查每一行是否是文件中的最后一行。所以它只处理比原始数据更多的数据。
    • 您的答案here 的链接也可能是有序的。我知道我将这个问题标记为最喜欢的问题,以便随时准备好。
    猜你喜欢
    • 1970-01-01
    • 2012-05-25
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    相关资源
    最近更新 更多