删除包含某个短语的单词

时间:2017-05-03 16:26:55

标签: bash shell text

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

我有

TCONS_5424934 XLOC_2348324
catgcatgcatgcatgcatcgt

TCONS_33345 XLOC_2342323
catgcatgcatgcatgcatcgt

我希望

XLOC_2348324
catgcatgcatgcatgcatcgt

XLOC_2342323
catgcatgcatgcatgcatcgt

我尝试过使用:

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

但这只是删除了整条线。如何删除整个单词?感谢

4 个答案:

答案 0 :(得分:1)

对正则表达式进行微小修改可以解决问题:

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

那个特定数据的GNU awk(和mawk):

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

XLOC_2342323
catgcatgcatgcatgcatcgt

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

答案 3 :(得分:0)

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