sed 不取代

sed 不取代

我想得到>chr05_pilon_pilon.12.1,但不幸的是下面的命令不会删除t

echo '>chr05_pilon_pilon.12.t1' | sed '/^\\>chr[0-9][0-9]_pilon_pilon/ s/\(.*\)t/\1/g'
>chr05_pilon_pilon.12.t1

我错过了什么?

答案1

每当您使用正则表达式时,您应该记住“少即是多”。我的意思是你应该总是尝试使用最简单的最短与您的数据匹配的模式。不要尝试匹配所有内容,只选择您真正需要的部分。

在这种情况下,您所>chr05_pilon_pilon.12.t1要做的就是删除最后t一个之后的最后一个.。因此,不要尝试从一开始就匹配,您不关心这一点,这只会使您的正则表达式更加复杂并且更容易出错,就像您所做的那样。以下是一些替代方案,具体取决于您的实际需要:

  1. 删除最后.一行以 开头的所有非数字字符>

     $ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>.*)\.[^0-9]*/\1./'
     >chr05_pilon_pilon.12.1
    
  2. 删除最后t一行以 开头的行>

     $ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>.*)t/\1/'
     >chr05_pilon_pilon.12.1
    
  3. 如上所述,但前提是t紧接在.

     $ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>.*\.)t/\1/'
     >chr05_pilon_pilon.12.1
    
  4. 删除ta 之后的最后一个,但仅限于以then.开头且后跟两个数字 和 的行:>chrpilon_pilon

     $ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>chr[0-9][0-9]_pilon_pilon.*\.)t/\1/'
     >chr05_pilon_pilon.12.1
    
  5. 最后,假设您可能还具有XYMMT染色体,您可能希望扩展上述内容以匹配这些染色体

     $ printf '>chrX_pilon_pilon.12.t1\n>chr05_pilon_pilon.12.t1\n>chrMT_pilon_pilon.12.t1\n' |
          sed -E 's/^(>chr([0-9XYM]{1,2}|MT)_pilon_pilon.*\.)t/\1/'
     >chrX_pilon_pilon.12.1
     >chr05_pilon_pilon.12.1
     >chrMT_pilon_pilon.12.1
    

答案2

您的模式尝试匹配\行开头的 a ,但您没有:

$ echo '>chr05_pilon_pilon.12.t1' | sed '/^\\>chr[0-9][0-9]_pilon_pilon/ s/\(.*\)t/\1/'
>chr05_pilon_pilon.12.t1

不尝试匹配\行开头的:

$ echo '>chr05_pilon_pilon.12.t1' | sed '/^>chr[0-9][0-9]_pilon_pilon/ s/\(.*\)t/\1/'
>chr05_pilon_pilon.12.1

您可能还希望允许 X、Y 和可能的 M 染色体(取决于您的基因组组装包含的内容):

echo '>chr05_pilon_pilon.12.t1' | sed -E '/^>chr([0-9][0-9]|[XYM])_pilon_pilon/ s/(.*)t/\1/'

还要注意,这/g不是必需的。

答案3

下面的命令将帮助您获得所需的输出

#!/bin/bash
echo '>chr05_pilon_pilon.12.t1' | sed 's/.t/./'

输出 :

 >chr05_pilon_pilon.12.1

相关内容