我一直在使用带有grep
扩展名的perl
进行多行匹配。但是,事实证明所有匹配的行号取决于第一个多行匹配中的行数!
找到grep
函数的c
正则表达式开始:
grep -iPn '^[^\S\n]*?\w+\s+\w+?\s*\([\w-0-9,/* \s]*\)\s*\{$'
我可以用一个例子更好地解释:
假设源文件中存在这两个函数
int f1(int a) {
int
f2 (int b )
{
在这种情况下,grep成功匹配正则表达式,输出到stdout的行号与源文件的行号相同。
当多线功能出现时出现问题。这改变了行号输出,在检查文件一段时间后我得出结论。多行函数匹配但由grep读取为单行,因此它为整个函数分配一个行号。函数后面的下一行根据“函数定义启动正则表达式”的行数得到它的行号短占据。
我的文件中有许多多行C
函数,并且每个函数的行号都有偏差。
有没有办法纠正这个?
答案 0 :(得分:3)
将pcregrep用于相同的正则表达式会显示正确的行号!
pcregrep -Mni '^[^\S\n]*?\w+\s+\w+?\s*\([\w-0-9,/* \s]*\)\s*\{$'
答案 1 :(得分:0)
您的解决方案无法使用我的(linux,gnu)grep。
我需要添加-z
才能使其正常运行。使用-z" line"由null char分隔;这样你就有一个"线",所以行号不起作用:(但是字节偏移呢。有时这就够了......
所以,使用grep:
grep -ziPbo '^[^\S\n]*?\w+\s+\w+?\s*\([\w-0-9,/* \s]*\)\s*\{$'
获得
24:int
f2 (int b )
{