【问题标题】:Delete everything after pattern including pattern删除模式后的所有内容,包括模式
【发布时间】:2019-06-28 11:18:02
【问题描述】:

我有一个类似的文本文件

some
important
content
goes here
---from here--
some 
unwanted content

我正在尝试删除---from here-- 之后的所有行,包括---from here--。也就是说,期望的输出是

some
important
content
goes here

我尝试了sed '1,/---from here--/!d' input.txt,但它没有删除---from here-- 部分。如果我使用sed '/---from here--.*/d' input.txt,它只会删除---from here-- 文本。

如何删除包含该模式的模式后的线条?

编辑

我可以通过执行第一个操作并将其输出传递到第二个操作来实现它,例如sed '1,/---from here--/!d' input.txt | sed '/---from here--.*/d' > outputput.txt
有单步解决方案吗?

【问题讨论】:

    标签: string unix awk sed


    【解决方案1】:

    你能不能试试关注(如果你对awk没问题)。

    awk '/--from here--/{found_from=1} !found_from{print}' Input_file
    

    【讨论】:

    • 永远不要在变量名中包含像no 这样的否定词,因为那样会在脚本中引入双重否定的高风险,就像您对!no_print (@987654325) 所做的那样@ - 即print)。双重否定总是更难理解,而且更容易导致代码中的错误。保持所有变量名称为正,以大大降低这种风险。
    • 同时避免使用作为命令的变量名(例如printno_print),因为这会引入控制耦合,其中一部分代码告诉另一部分该做什么。而是使用条件名称,例如found_from,然后让代码的后面部分决定当条件为真时要做什么——这将使您的代码更松散耦合,并且以后更容易增强(例如,如果从现在起 6 个月后,您决定在出现 from here 时不想打印,而是想退出?)
    • @EdMorton,对不起,Ed 我忘了,我现在会尽量不保留这些常用词,现在已经改变了。谢谢你一直和我在一起:) 祝你有美好的一天。
    【解决方案2】:

    我并不肯定,但我相信这会奏效:

    sed -n '/---from here--/q; p' file
    

    q 命令告诉sed 在匹配给定行后退出处理输入行。

    【讨论】:

    • 给出错误 sed: 1: "q/---from here---/": extra characters at the end of q command
    • 抱歉,已修复:q 位于正则表达式之后(右侧)。
    • 我认为这类似于sed '1,/---from here--/!d' input.txt
    • 是的,@SLePort 得到了正确答案。请忽略我的。
    【解决方案3】:

    使用 sed 的另一种方法:

    sed '/---from here--/,$d' file
    

    d(delete) 命令适用于从包含---from here-- 的第一行到文件末尾($) 的所有行

    【讨论】:

      【解决方案4】:

      另一种 awk 方法:

      awk '/---from here--/{exit}1' file
      

      如果您有 GNU awk 4.1.0+,您可以添加 -i inplace 以就地更改文件。
      否则附加 | tee file 以就地更改文件。

      【讨论】:

      • 我相信 this 是正确的解决方案。 :-)。如果目标正则表达式出现在大文件的早期并且在任何其他条件下不慢,这将比@SLePort's sed solution 快一个数量级。尝试 time seq 1000000 | sed '/10/,$d' >/dev/nulltime seq 1000000 | awk '/10/{exit}1' >/dev/null 并注意到 awk 快得多,然后将 10 更改为 999999 并重复并注意它们的速度大致相同。
      • @EdMorton 谢谢,OP 实际上没有包含awk 标签:-)
      • 这只是意味着他们在发布问题时没有想到 awk,如果/当我们知道时,我们绝对应该向他们展示更好的方式。
      • 如何进行就地更换。即,将内容写入同一个文件
      • @Johnykutty 哦,那你可以试试` | tee 文件的方法来查看它是否有效。我建议你 brew install gawk 使用 gawk ;)
      【解决方案5】:

      你可以试试 Perl

      perl -ne ' $x++ if /---from here--/; print if !$x '
      

      使用您的输入..

      $ cat johnykutty.txt
      some
      important
      content
      goes here
      ---from here--
      some
      unwanted content
      
      $ perl -ne ' $x++ if /---from here--/; print if !$x ' johnykutty.txt
      some
      important
      content
      goes here
      
      $
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-26
        相关资源
        最近更新 更多