多线模式搜索和替换perl

时间:2017-12-12 21:05:37

标签: regex perl powershell

给定以下类型的输入(包含在众多文件中):

ret = myFunc(&pConfig->hConstraintList, &pConfig->util,
                   2, sizeof(rcConstraint_t),
                   NULL, NULL, NULL, NULL, NULL);

我试图让以下正则表达式匹配:

myFunc\((\S*)\s*(\S*)\s*(\S*)\s*(\S*)\s*(\S*?),\s*NULL,\s*NULL,\s*NULL,\s*NULL\s*\).*;

想法是用以下内容替换它:

myFuncNoCB($1 $2 $3 $4 $5);

这可以作为.NET正则表达式使用,但在PowerShell中进行文件内搜索和替换是一件痛苦的事,VS UI并不完全支持多行表达式。

所以... perl的。但我甚至无法让比赛奏效:

以下是我尝试的内容:

perl -0ne '/myFunc\((\S*)\s*(\S*)\s*(\S*)\s*(\S*)\s*(\S*?),\s*NULL,\s*NULL,\s*NULL,\s*NULL\s*\).*;/gms' myfile.cpp

我的假设是perl即使在多线模式下也不考虑换行空格?这将是一个完整的噩梦,因为每个参数可以在它们之间以任何顺序包含任意数量的空格,制表符,换行符。

我对任何有效的解决方案感兴趣,坦率地说。这里有很多变数。我在这个特定的文件上做了perl -pi -e 's/\r//g'以消除这个潜在的问题,但我也希望找到一个不会在\r上扼杀的解决方案。

PS - 我已经谷歌搜索了这个问题,并搜索了stackoverflow。问题是大多数人使用" multiline"只需要搜索多行...一次一个。那些正确使用它的人有着截然不同的模式,他们试图匹配那些不能帮助我的模式。如果有一个帮助我的答案,我无法找到它。

1 个答案:

答案 0 :(得分:3)

您不需要/m修饰符,因为它会更改您在正则表达式中使用的^$的行为。

同样适用于/s - 它使.与换行符匹配,但您不需要它,\s已经匹配包括换行符在内的所有空格。

我在正则表达式中列出逗号并在结尾处省略.*,因为它可以(与/s)匹配文档的其余部分。

perl -0pe 's/myFunc\((\S*),\s*(\S*),\s*(\S*),\s*(\S*),\s*(\S*?),
             \s*NULL,\s*NULL,\s*NULL,\s*NULL\s*\)
            /myFuncNoCB($1, $2, $3, $4)/xg' -- file