是否有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)可以吗?
谢谢
答案 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
在命令行上执行代码。