【发布时间】:2012-06-29 02:31:32
【问题描述】:
我一直在使用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 函数,而且每个函数的行号都相差太大。
有没有办法纠正这个问题?
【问题讨论】:
-
在匹配之前将整个文件读入内存的解决方案是否可以接受?换句话说,您的输入文件不是很大吗?我假设 C 源文件的大小是合理的。如果我们能做到这一点,那就更容易了。
-
是的,尺寸合理,但总有一个限制。正如您提到的“这样”,但是哪个?