sed:パターンを一致させ、後に表示される他のパターンをそれぞれ置き換えます。 [閉じる]

sed:パターンを一致させ、後に表示される他のパターンをそれぞれ置き換えます。 [閉じる]

私が持っていてそれが同じパターンであると仮定aaaaabaaaaaします。ab

パターンマッチングを実行してから「以降」aaaaaabを「すべて」に置き換えますが、「以前」は置き換えない方法は何ですか?aaaaabbab

答え1

sedでは複雑すぎますが、Perlでははるかに簡単です。

perl -pe '/b/g and substr($_, pos) =~ s/a/A/g'

最初の一致は、位置が設定されている文字列の/b/g最初の項目と一致します。その後、その場所から始まる部分文字列が置き換えられます。bpos

答え2

sedを使用してください。ただし、データに絶対に含まれない文字シーケンスを選択する必要があります。

 ( echo 'zzzaaaaadddd' ; 
   echo 'ssssaaaaajaaaaakaaaaa'; 
   echo 'ssssaaaaaaaaaakaaaaa';  ) | \
      sed '/aaaaa.*aaaaa/ { s/aaaaa/_=|=_/; s/aaaaa/GGGGG/g; s/_=|=_/aaaaa/ }'

zzzaaaaadddd
ssssaaaaajGGGGGkGGGGG
ssssaaaaaGGGGGkGGGGG

説明する:

  • 少なくとも2本のaaaaaラインが影響を受けます。
  • 変えるああああ_=|=_あなたは決して持つことができないロープを持っています
  • 他の人に代わるあああああなたが望むことをしなさいググググ
  • _=|=_再交換ああああ

答え3

また、次の再帰sedソリューションを試してください。

sed ':L; s/\(a*\)b\(a*\)a/\1b\2b/; tL; ' file

すべてのターゲットイベントが完了するまで、各ターゲットaイベントを繰り返し置き換えます。b

関連情報