数値数量子としてsed - どのように?

数値数量子としてsed - どのように?

スラッシュとその後のすべての内容が削除されるように、複数のファイルの fasta ヘッダーを編集しようとします (「以降のすべての内容」が 10 文字以下の場合)。ヘッダー行は「>」と表示されます。

for i in ./*.fa;do sed -r 's/(>.*)\/.\{,10\}\n/\1\n/' "$i"; done

私も試しました

for i in ./*.fa;do sed -r 's/(>.*)\/.{,10}\n/\1\n/' "$i"; done

しかし、状況は良くなるシミが見えません。私の直感では、{,10}数量子がすべてを壊すということです。しかし、よくわかりません。助けてくれてありがとう!

たとえば、ファイルに次のものが含まれているとします。

>header1_some_extra_data_here/1-1000
ATGCGGGTACCCCA
>code/header2_some_extra_data
AGGTCCCCGGGAAAAA

出力が次のようになります。

>header1_some_extra_data_here
ATGCGGGTACCCCA
>code/header2_some_extra_data
AGGTCCCCGGGAAAAA

ベストアンサー1

sed入力データで改行文字を一致させることができないため、交換は期待どおりに機能しません。これはsed、ファイルが1行ずつ読み取られるためです。つまり、改行を区切り文字として使用し、式は区切り線を使用せずに行に個別に適用されます。

代わりにコードを少し変更してください。

for fasta in ./*.fa; do
    sed 's;^\(>.*\)/.\{0,10\}$;\1;' "$fasta"
done

私が変更したものは次のとおりです。

  1. デフォルトではなくコマンド;の区切り文字として使用されます。これにより、私たちはパターンの問題から抜け出すことができなくなります。ほとんどすべての文字を区切り文字として使用できますが、パターンまたは代替テキストには表示されない文字を選択する必要があります。s/////
  2. 標準の基本正規表現構文を使用してください。パターンでは、(...)拡張正規表現構文はデフォルトの\{...\}正規表現構文です。移植性のために基本構文を使用することにしました。これはまた、-rGNUで拡張構文を有効にするオプションを放棄するという意味でもありますsed
  3. パターンを使用して線の始めと終わり^にそれぞれ固定します$
  4. 代替ビットに改行文字を挿入しようとしないでください。

sedそれを表現するもう一つの短い方法は次のとおりです。

sed '/^>/s;/.\{0,10\}$;;'

>これにより、その文字で始まるすべての行に置換が適用されます(/^>/後続のコマンドの「アドレス」として機能しますs///)。置換は単に/行末まで続くビットを削除します。もしこのビットの長さは10文字以下です。

おすすめ記事