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で始まり、その後に2つの数字の合計が続く行からのみ削除します。>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. X最後に、、、YまたはM染色体もあると仮定すると、MT上記の内容を拡張して対応する染色体と一致させることができます。

     $ 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

関連情報