私が持っていてそれが同じパターンであると仮定aaaaabaaaaa
します。a
b
パターンマッチングを実行してから「以降」aaaaaab
を「すべて」に置き換えますが、「以前」は置き換えない方法は何ですか?aaaaa
b
b
a
b
答え1
sedでは複雑すぎますが、Perlでははるかに簡単です。
perl -pe '/b/g and substr($_, pos) =~ s/a/A/g'
最初の一致は、位置が設定されている文字列の/b/g
最初の項目と一致します。その後、その場所から始まる部分文字列が置き換えられます。b
pos
答え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