在线查找模式并替换替换中评估模式部分的位置

时间:2014-04-25 22:28:10

标签: regex perl

我有一个文本行(带有引导值的newick文件格式),其中包含0.000和1.000之间的许多数字,我希望乘以100并将该值作为0到100之间的舍入整数返回。这些数字都在前面a")"然后是":"。在文本行中还有其他数字我想要保持不受影响,并不被这些包围。我一直在尝试使用perl单行代码执行此操作:

perl -ape 's/\)(\d\.\d+):/\)int($1*100+.5):/eg' test.newick

但是,由于语法错误,它失败了,我相信因为它无法评估")"":"我试图保留在替换中。有什么建议我怎么做?谢谢!

1 个答案:

答案 0 :(得分:0)

一些问题:

  • 括号是正则表达式的特殊字符。如果你想让它成为LHS中的文字,你只需要用反斜杠来逃避它。
  • 你的RHS需要使用字符串连接,因为它被证实
  • 考虑使用s{}{}作为正则表达式分隔符以避免斜塔混乱

解析如下:

perl -ape 's{\)(\d.\d+):}{")" . int($1*100+.5) . ":"}eg' test.newick

或者,如果您不想复制RHS中的文字文本,可以使用前瞻和后瞻断言

perl -ape 's{\)\K(\d.\d+)(?=:)}{ int($1*100+.5) }eg' test.newick