用sed进行变量字符串转换

时间:2017-02-28 10:11:42

标签: regex bash sed

我正在尝试使用sed转换变量字符串,具体取决于上下文。

string="GAGGTGGGTGGGGAGC"
echo $string | sed -r 's/G+([AT])/A+\1/g'

结果是:A+AA+TA+TA+AGC。但我希望:AAAATAAATAAAAAGC

换句话说,我想用一段未知的Gs替换为As,只要它们后面跟着A或T.我们怎样才能恢复匹配模式的Gs数量,以便在替换模式中重用它?

1 个答案:

答案 0 :(得分:3)

使用sed,使用反向引用和t(test)命令在命令开头循环,以便在替换成功时进一步替换:

$ sed ':a;s/G\([AT]\)\(.*\)/A\1\2/;ta;' <<< "GAGGTGGGTGGGGAGC"
AAAATAAATAAAAAGC

工作原理:

  • :aa即将发布的循环标签
  • s:替换命令
  • G\([AT]\):搜索G后跟AT。捕获第二个字母,将使用反向引用替换字符串
  • \(.*\):捕获剩余的字符
  • A\1\2:替换为A后跟先前捕获的字符串(AT及剩余字符)
  • ta:如果之前的替换成功,请转到脚本标签:a(开头)以检查是否有进一步替换