【问题标题】:Remove all lines except matching pattern line best practice (sed)删除除匹配模式行最佳实践 (sed) 之外的所有行
【发布时间】:2023-07-10 15:56:01
【问题描述】:

我想删除除包含匹配模式的行之外的所有行。

我就是这样做的:

sed -n 's/matchingpattern/matchingpattern/p' file.txt

但我只是好奇,因为我将匹配模式重命名为匹配模式本身。在这里看起来很浪费。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: unix sed


    【解决方案1】:
    sed '/pattern/!d' file.txt
    

    但你在这里重塑了grep

    【讨论】:

    • 是的。但是 sed 有这个漂亮的 --in-place 标志,而 grep 没有。 sed -i '/pattern/!d' filename 比 grep 'pattern' filename > filename.tmp && mv filename.tmp filename 容易得多
    • 警告:我提供了 --quiet 标志以避免将任何结果打印到终端,但没有意识到 -i 本身已经实现了这一点。这意味着所有行都被删除了,即使是那些与模式匹配的行。
    【解决方案2】:

    grep 当然更好...因为它更快。

    例如使用 grep 提取我正在使用的数据集中第 6 号染色体的所有基因组序列数据:

    $ time grep chr6 seq_file.in > temp.out
    
    real    0m11.902s
    user    0m9.564s
    sys 0m1.912s
    

    与 sed 相比:

    $ time sed '/chr6/!d' seq_file.in > temp.out
    
    real    0m21.217s
    user    0m18.920s
    sys 0m1.860s
    

    我重复了 3 次,每次都使用相同的值。

    【讨论】:

      【解决方案3】:

      这可能对你有用:

      sed -n '/matchingpattern/p' file.txt
      

      /.../ 是一个地址,在这种情况下可能会附加操作 p

      【讨论】:

        【解决方案4】:

        不要使用复杂的sed,而是使用grep。

        grep matching_pattern file
        

        这应该会给你想要的结果。

        【讨论】:

        • +1 表示“正确的工具”。但 sed 可以就地修改文件。
        最近更新 更多