regex - 从命令行,仅在另一个正则表达式匹配后才进行 perl 替换匹配

标签 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
    */

最佳答案

你可以尝试这样的事情:

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/

相关文章:

perl - 这段读取文件的代码有什么问题?

java - 拒绝访问 - 无法在特定目录中创建文件

perl - 将机械化浏览器传递给子例程(带有 WWW::Mechanized 的 Perl)

java - Java 中的最佳文件 I/O 选项?

html - go - 打开文件没有那个文件或目录

java - Java 中的正则表达式分组

python - 匹配 s3 链接的正则表达式

javascript - 如何使用正则表达式替换 css 类中的背景 url (javascript)

python - 根据模式 : Python 识别一组文件和进程

mysql - 在 Perl 中转义 MySQL 数据库输入的字符串的等价物是什么?