给定以下输入类型(包含在许多文件中):
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 -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-我已经用Google搜索了这个问题,并搜索了stackoverflow。问题在于,大多数使用“多行”的人只需要搜索多行...一次即可。那些正确使用它的人尝试匹配的模式有很大不同,这对我没有帮助。如果有可以帮助我的答案,我找不到。
最佳答案
您不需要/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
关于regex - Perl中的多行模式搜索和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47781514/