sed 不替换

use*_*828 3 sed regular-expression

我想得到>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
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Kus*_*nda 6

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

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

无需尝试匹配\行首的 :

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

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

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

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


ter*_*don 6

无论何时使用正则表达式,都应该记住“少即是多”。我的意思是您应该始终尝试使用与您的数据匹配的最简单最短的模式。不要试图匹配所有东西,只选择你真正需要的部分。

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

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

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

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

     $ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>.*\.)t/\1/'
     >chr05_pilon_pilon.12.1
    
    Run Code Online (Sandbox Code Playgroud)
  4. 删除ta 之后的最后一个,.但仅在以>thenchr开头的行上,后跟两个数字 and pilon_pilon

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

     $ 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
    
    Run Code Online (Sandbox Code Playgroud)