2017-03-01 4 views
4

テキスト内の3つの特定の文字(トリプレット)を置き換える必要があります。 Iは、位置1、4、7、10から始まる13等をパターンにマッチしたいがない等sedを使用して3文字のグループを選択的に置き換える方法

例:位置2、3、5、6で、Iは、/ルックNNN内でtaaを置換しますctaagctaaggcgtaagaというテキストがあり、ctaagcNNNggcgtaagaを取得したいとします。

最初の「taa」は位置2で開始し、一致/置換しないでください.2番目の位置は位置7から始まり、置き換えられます。3番目の位置は位置14から始まり、一致しません。


ここまでの解決策は、トリプレットを '+'で区切ることです。置換えを行い、すべて '+'を削除してください。しかし、私は単一のsedコマンドでより洗練されたソリューションを考えています。 GNU sed

echo ctaagctaaggcgtaaga | sed 's/taa/NNN/2' 

ctaagcNNNggcgtaaga 

​​

答えて

1

これが2つ目のインスタンスを置き換えますが、私は、実際の要件を逃しました。以下は私の知る限り、あなたがこれを達成するために、複数のsedコマンドが必要になります知っているように、正しい位置にトリプル

echo ctaagctaaggcgtaaga | 
fold -w3 | 
sed 's/taa/NNN/' | 
tr -d '\n'; echo "" 

ctaagcNNNggcgtaaga 
+0

これは、1,4,7で始まる一致をロックしません... – Thor

+0

それは間違っています....例えば、 "" taacgctaaggcgtaaga "'は "NNNcgcNNNggcgtaaga"を与えます。 –

+0

これは良いですね。最後の '' echo "" 'のみが何ですか? – tomasz

1

を置き換えます。

<<<ctaagctaaggcgtaaga bsdsed 's/.../&+/g; s/taa/NNN/g; s/+//g' 

出力:

ctaagcNNNggcgtaaga 
1

あなたは、単一のsコマンドでこれを行うことができます。

sed 's/^\(\(...\)*\)taa/\1NNN/g' 

ただし例えば、sedの1回の呼び出しでコマンドのすべてを行うことができますマッチは文字列の先頭に固定されており、taaの前に文字の三つ組。三つ子はそれ自身のために下塗りされています。

使用例:

sed 's/^\(\(...\)*\)taa/\1NNN/g' <<EOF 
ctaagctaaggcgtaaga 
EOF 

出力:

ctaagcNNNggcgtaaga 
0

これはあなた(GNU SED)のために働くかもしれません:

sed -r ':a;s/^((...)*)taa/\1NNN/;ta' file 

これは、バックラインのマッチングの端から作品すべての試合が行われるまで繰り返されます。

関連する問題