替换2个字符串之间的文本(包括)

时间:2014-06-24 00:29:18

标签: regex perl

是否有perl单行可以替换2个字符串(包括两个字符串)之间的某些文本?例如,在下面的文本中,我需要替换'rrpv_bits = 2''options.cacheline_size'之间的所有内容,其中'num_sets = 512'在文本中的所有位置均为找到标记字符串。所以原始文本看起来就像想要的那样。

原件:

    repl = ReplacementPolicy(rrpv_bits = 2,
                             ins = 2,
                             num_sets = l2_cache.size.getValue() /
                             options.l2_assoc / options.cacheline_size,
                             assoc = options.l2_assoc)

所需:

    repl = ReplacementPolicy(num_sets = 512,
                             assoc = options.l2_assoc)

如果perl one-liner无法做到这一点,那还有什么(Linux,one-liner)可以吗?

谢谢

1 个答案:

答案 0 :(得分:1)

如果它们总是在一起存在,那就是perl one-liner:

perl -0777 -pe 's/rrpv_bits = 2.*?options\.cacheline_size/num_sets = 512/gs' file.txt > newfile.txt

然而,这种方法可能太贪心了。如果第一个边界在ReplacePolicy调用中匹配而不是第二个边界会发生什么?然后正则表达式会占用所有行,直到找到包含结束条件的第二个ReplacePolicy。

因此,为了防止这种情况,我们可以限制边界条件之间的字符,只允许平衡括号。这会将匹配锁定在ReplacePolicy的参数中:

perl -0777 -pe 's/rrpv_bits = 2((?:[^()]*|\((?1)\))*)options\.cacheline_size/num_sets = 512/gs;' file.txt > newfile.txt

说明:

切换

  • -0777:覆盖整个文件
  • -p:为输入文件中的每个“行”创建一个while(<>){...; print}循环。
  • -e:告诉perl在命令行上执行代码。