3

我在每行多个匹配的注释中进行了一些大规模字符替换,这减少了标题中提到的问题。有没有一种简单的方法可以在 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
    */
4

1 回答 1

2

你可以尝试这样的事情:

perl -pwe 'if (m#/\*# .. m#\*/#) { 
    s/\w\.*\K( {2,})(?=\S)/ "." x length($1) /eg; }' input.txt > output.txt

但请注意,将评论与正则表达式匹配是一件棘手的事情。只要评论遵循你的简单风格,你应该没问题,但也要注意它与其他评论的匹配。

在这个单行代码中,我使用触发器运算符来匹配打开和关闭注释符号。在内部,它匹配任何\w后跟可选句点的字母数字,并将其后的任何空格(2 个或更多)替换为句点。最后的前瞻是为了防止它在最后一个单词之后添加句点,例如foo....bar.....

我选择使用( +)仅捕获空格,但您可以将其替换为(\s+). 但是,如果您想保留缩进,用句点替换制表符会更加棘手。

预计到达时间:

您可能希望使用该-i选项对文件执行就地编辑,这在处理多个文件时很方便。安全的方法是使用备份,例如-i.bak.

于 2012-06-07T00:16:51.687 回答