我在每行有多个匹配项的注释中进行了一些大量字符替换,这减少了标题中提到的问题。有没有一种简单的方法可以在 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
*/
最佳答案
你可以尝试这样的事情:
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
.
关于regex - 从命令行,仅在另一个正则表达式匹配后才进行 perl 替换匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10923737/