我正在尝试使用sed转换变量字符串,具体取决于上下文。
string="GAGGTGGGTGGGGAGC"
echo $string | sed -r 's/G+([AT])/A+\1/g'
结果是:A+AA+TA+TA+AGC
。但我希望:AAAATAAATAAAAAGC
换句话说,我想用一段未知的Gs替换为As,只要它们后面跟着A或T.我们怎样才能恢复匹配模式的Gs数量,以便在替换模式中重用它?
答案 0 :(得分:3)
使用sed,使用反向引用和t
(test)命令在命令开头循环,以便在替换成功时进一步替换:
$ sed ':a;s/G\([AT]\)\(.*\)/A\1\2/;ta;' <<< "GAGGTGGGTGGGGAGC"
AAAATAAATAAAAAGC
工作原理:
:a
:a
即将发布的循环标签s
:替换命令G\([AT]\)
:搜索G
后跟A
或T
。捕获第二个字母,将使用反向引用替换字符串\(.*\)
:捕获剩余的字符A\1\2
:替换为A
后跟先前捕获的字符串(A
或T
及剩余字符)ta
:如果之前的替换成功,请转到脚本标签:a
(开头)以检查是否有进一步替换