Regex 如何快速找到与正则表达式匹配的文件的第一行?
我想在Perl脚本中使用正则表达式搜索文件中的一行 假设它位于安装了grep的系统中,是否最好:Regex 如何快速找到与正则表达式匹配的文件的第一行?,regex,perl,sed,grep,Regex,Perl,Sed,Grep,我想在Perl脚本中使用正则表达式搜索文件中的一行 假设它位于安装了grep的系统中,是否最好: 通过open()命令调用外部grep open()直接打开文件,使用while循环和if($line=~m/regex/) 在现代的Perl实现中,regexp代码应该和grep一样快,但是如果您关心性能,为什么不试试呢?从代码干净性和健壮性的角度来看,调用外部命令行工具肯定不好。这取决于具体情况 在Perl内部工作可以节省进程启动时间和其他相关资源成本 grep可能比用Perl做同样的工作要快
- 通过
命令调用外部open()
grep
直接打开文件,使用open()
循环和while
if($line=~m/regex/)
- 在Perl内部工作可以节省进程启动时间和其他相关资源成本
- grep可能比用Perl做同样的工作要快,但速度不是很大
除非性能迫使您进行优化,否则我建议您使用Perl进行优化。使用grep需要注意的一件事是:在最近的Linux发行版中,如果您的LANG环境变量定义了UTF-8类型(例如,我的是LANG=en_GB.UTF-8),那么grep、sed、sort以及其他一些文本处理实用程序的运行速度可能要慢10倍左右。因此,如果您正在进行性能比较,请注意这一点。我现在将grep命令别名为:
LANG= LANGUAGE= /bin/grep
编辑:实际上,它的速度要慢100倍您不需要显式地打开文件
my $regex = qr/blah/;
while (<>) {
if (/$regex/) {
print;
exit;
}
}
print "Not found\n";
最好是这样
编辑:这假设要检查的文件是在命令行中给出的,我刚刚注意到您没有说明它适用于您的情况。视情况而定。如果您想优化开发时间
$line = `grep '$regex' file | head -n 1`;
这显然是应该做的事情
但是它的代价是必须启动外部进程,这取决于安装的perl以外的东西,并且在出现错误时失去了进行详细错误报告的机会。我曾经编写了一个脚本,在一些大文本文件(每个文件大约10 MB)中搜索一些正则表达式。我用Perl正则表达式做了这项工作,并注意到它运行得非常慢。所以我试着用脚本运行grep,速度提高了很多。因此,根据我自己的经验,Perl内置正则表达式比grep慢。但你可能只会注意到它与大文件。我的建议是:两种方法都试一下,看看效果如何。速度稍微快一点,但使用非常全局的$并不值得10%(搜索/zebra/在240k行/usr/dict/words中测量)。如果您在while循环之外分配$line,则性能影响将消失。相反,请使用grep内置的
--max count=1
在第一次匹配时停止grepping。通过这种方式,您可以避免将文件处理到底的开销(这对于大型文件可能非常重要),以及启动另一个进程以运行head-n1
的开销。这是一个GNU扩展。有用,但不一定总是存在
sed '/pattern/q' file
sed '/pattern/q' file