假设我有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
直到完成所有目标事件。