3番目の文字ごとに文字を追加するsed 1行コマンドを書くには?

3番目の文字ごとに文字を追加するsed 1行コマンドを書くには?

だから、次のような文字列があります。

AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA

文字列を「+」記号で区切られた3つの文字の塊に分割したいと思います。

AUG+GCC+AUG+GCG+CCC+AGA+ACU+GAG+AUC+AAU+AGU+ACC+CGU+AUU+AAC+GGG+UGA

良い友達と一緒にしたいですsed

頑張った

cat codons | sed -r 's/([A-Z]\{3\})/\1\+/g'

...成功できませんでした。

sedどのコマンドを使用できますか?

答え1

末尾が欲しくないので、+次のようにすることができます。

fold -w3 | paste -sd+ -

つまり、fold文字IDの行と区切り文字でスプライトを持つ3つの文字行は、事実上最後の行を除くすべての改行をに変更するのと同じです。入力に複数の行がある場合、この行は次のように関連付けられます。 a 、あなたが望むものであってもなくてもよい。3wpastes+d++

本当に必要な場合は、sed末尾を削除できます+

sed 's/.../&+/g;s/+$//'

答え2

sed 's/.../&+/g'

{}作業中にシンボルをエスケープする必要はありません。

sed -r 's/([A-Z]{3})/\1+/g'

答え3

これはあなたに役立ちます(GNU sed):

sed 's/...\B/&+/g' file

答え4

sed が不要な場合は、Ruby を使用することが代替手段となります。 Rubyインタプリタは、入力を繰り返すオプションを使用して実行し、rubysedやawkのように使用できます。-n次に、Ruby one-linerをオプションに引数として追加してインタプリタに渡すことができます(ファイル内のスクリプトを見つけるのではなく、インタプリタに-e解釈する内容を教えてください)。-e

この特定の問題には、次の単一ライナーを使用できます(https://stackoverflow.com/a/3184271/789593):

ruby -ne 'puts $_.scan(/.{3}|.+/).join("+")'

一般的な言語は次のとおりです。

  • scan(/.{3}|.+/)入力文字列内の任意の3文字または1つ以上の文字と一致し$_(この場合、入力は標準入力から来ると予想されます)、各一致を配列に入れます。
  • 配列を文字列で連結し、各要素を「+」で連結しますjoin("+")
  • 改行文字で終わるものを印刷しますputs

例えば

echo "AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUG" | ruby -ne 'puts $_.scan(/.{3}|.+/).join("+")'
AUG+GCC+AUG+GCG+CCC+AGA+ACU+GAG+AUC+AAU+AGU+ACC+CGU+AUU+AAC+GGG+UG

末尾の「+」は追加されません。

関連情報