我在评论中做了一些大量字符替换,每行有多个匹配,这减少了标题中提到的问题。是否有一种简单的方法可以在Perl单线程中执行此操作?到目前为止,我想到的最简单的方法是做一些像
这样的事情perl -pi e 's/(.*regex1.*)(regex2)/$1replacement/' filename
然后直接运行,直到文件停止更改。似乎必须有更好的方法为此做一个单行。
示例输入(列数因文件而异):
/*
* name val1 val2
* foo 2345 23
* barbaz 34 23456
*/
示例输出:
/*
* name.....val1.....val2
* foo......2345.....23
* barbaz...34.......23456
*/
答案 0 :(得分:2)
您可以尝试这样的事情:
perl -pwe 'if (m#/\*# .. m#\*/#) {
s/\w\.*\K( {2,})(?=\S)/ "." x length($1) /eg; }' input.txt > output.txt
但请注意,将评论与正则表达式匹配是一项棘手的工作。只要评论遵循您的简单风格,您应该没问题,但请注意它与其他评论相匹配。
在这个单行中,我使用触发器操作符来匹配开放和关闭注释符号。在里面,它匹配任何字母数字\w
,后跟可选句点,并用句点替换其后的任何空格(2或更多)。最后的预测是为了防止它在最后一个单词之后添加句点,例如foo....bar.....
我选择使用( +)
仅捕获空格,但您可以将其替换为(\s+)
。但是,如果要保留缩进,则用句点替换制表符将会更加棘手。
<强> ETA:强>
您可能希望使用-i
选项对文件执行就地编辑,这在执行多个文件时很方便。安全的方法是使用备份,例如-i.bak
。