【问题标题】:Remove lines with specific pattern with Bash使用 Bash 删除具有特定模式的线条
【发布时间】:2016-12-31 02:58:32
【问题描述】:

我有一个文件,每行一个单词/字符。示例:

a
abandonado
esta
estabelecimento
o
onibus
c
casa
police

我需要删除带有特定图案的线条(例如图案“esta”)。我用 awk 试过了

cat file | awk '!/^esta/' 

但此解决方案也删除了所有带有 "esta""estabelecimento" 模式的行。我只需要删除带有特定模式"esta" 的行而不是"estabelecimento" 的行。

具有"o""a" 模式的行也会出现同样的问题。该命令删除所有以该模式开头的行。

【问题讨论】:

标签: linux bash awk sed


【解决方案1】:

简单使用grep:

grep -v -w esta file
  • -w 选项匹配“仅单词”/“确切单词”:正是您需要的
  • -v 选项反转匹配:只打印不匹配的行

【讨论】:

    【解决方案2】:

    你的想法是对的,^匹配模式的开头,通过匹配$作为模式结束来完成它,这样整个单词就可以匹配了

    awk '!/^esta$/' file
    a
    bandonado
    estabelecimento
    o
    onibus
    c
    casa
    police
    

    【讨论】:

      【解决方案3】:

      由于您的文件由只有一列的行组成,您可以检查一列是否与字符串匹配。

      这消除了对锚点 ^$ 的需要:

      $ awk '$1 != "esta" {print}' file
        a
        abandonado
        estabelecimento
        o
        onibus
        c
        casa
        police
      

      【讨论】:

        【解决方案4】:

        您也可以根据this 问题使用sed 执行此操作:

        $ cat test.txt
        a
        abandonado
        esta
        estabelecimento
        o
        onibus
        c
        casa
        police
        

        $ sed '/^esta$/d' test.txt
        a
        abandonado
        estabelecimento
        o
        onibus
        c
        casa
        police
        

        grep 更简单,但sed 可以为您提供更大的灵活性,具体取决于您的用例和每个人的舒适度。

        【讨论】:

        • 不需要使用cat,sed本身可以读取文件并进行操作,通常称为UUOC(Useless use of cat)。
        猜你喜欢
        • 2018-01-16
        • 2017-01-04
        • 2019-11-05
        • 1970-01-01
        • 2016-12-19
        • 1970-01-01
        • 2019-07-30
        • 1970-01-01
        • 2017-10-20
        相关资源
        最近更新 更多