从命令行开始,只在匹配另一个正则表达式之后才进行perl替换匹配

时间:2012-06-06 23:29:01

标签: regex perl file

我在评论中做了一些大量字符替换,每行有多个匹配,这减少了标题中提到的问题。是否有一种简单的方法可以在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
    */

1 个答案:

答案 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