sed:匹配模式,并替换此后每次出现的不同模式

sed:匹配模式,并替换此后每次出现的不同模式

假设我有aaaaabaaaaa,并假设a可以是任意模式;同样对于b.

如何模式匹配,然后用' 替换后面的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直到完成所有目标事件。

相关内容