【问题标题】:deleting words which contain a certain phrase删除包含特定短语的单词
【发布时间】:2017-05-04 01:41:05
【问题描述】:

我希望删除所有包含特定短语 (TCNS) 的字符串

我有

TCONS_5424934 XLOC_2348324
catgcatgcatgcatgcatcgt

TCONS_33345 XLOC_2342323
catgcatgcatgcatgcatcgt

我愿意

XLOC_2348324
catgcatgcatgcatgcatcgt

XLOC_2342323
catgcatgcatgcatgcatcgt

我尝试过使用:

sed 's/\S*\(TCONS)\S*//g'

但这只会删除整行。如何删除整个单词?谢谢

【问题讨论】:

  • 运行你的 sed 命令给我一个错误(不匹配的括号)。

标签: bash shell text


【解决方案1】:

对正则表达式稍作修改即可解决问题:

sed 's/\S*TCONS\S*\s*//g' file

这会删除任意数量的非空格,后跟 TCONS,后跟任意数量的非空格,以及任何尾随空格。

【讨论】:

    【解决方案2】:

    好吧,GNU awk(和 mawk)用于特定数据:

    $ awk -v RS="[ \n]" '!/TCONS/' file
    XLOC_2348324
    catgcatgcatgcatgcatcgt
    
    XLOC_2342323
    catgcatgcatgcatgcatcgt
    

    它使用空格和换行符作为记录分隔符,基本上将一条记录上的多个单词分解为多个记录,但您的预期输出允许它。

    【讨论】:

      【解决方案3】:

      您也可以使用字符类来表达相同的想法,可读性可能会/可能不会更好,这更多的是品味问题,例如

      sed 's/[^ \t]*TCONS[^ \t]*[ \t]*//g' file.txt
      

      基本上,它只查找包含TCONS 的任何字符串,由spacetab(如果存在)分隔,并删除该字符串以及任意数量的后续空格或制表符。正如 Tom 所示,字符串和空格指示符(\S\s)是一个非常干净的实现,但字符类也是一个可行的选择,具体取决于对您最有意义的选项。

      【讨论】:

        【解决方案4】:

        这样做:
        sed 's/\b\s*\S*TCONS\S*\s*\b//g'
        正则表达式中的 \b 匹配单词边界。 - 所以它只会删除带有 TCONS 的单词。它还会删除单词前后的所有空格字符,其中子字符串是 TCONS

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-19
          • 1970-01-01
          • 2019-02-19
          相关资源
          最近更新 更多