Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在400';000个文件_Regex_Perl - Fatal编程技术网

Regex 在400';000个文件

Regex 在400';000个文件,regex,perl,Regex,Perl,我有大约40万个文件需要替换一些文本 我尝试了以下Perl脚本: @files = <*.html>; foreach $file (@files) { `perl -0777 -i -pe 's{<div[^>]+?id="user-info"[^>]*>.*?</div>}{}gsmi;' $file`; `perl -0777 -i -pe 's{<div[^>]+?class="generic"[^>]

我有大约40万个文件需要替换一些文本

我尝试了以下Perl脚本:

@files = <*.html>;

foreach $file (@files) {
    `perl -0777 -i -pe 's{<div[^>]+?id="user-info"[^>]*>.*?</div>}{}gsmi;' $file`;

    `perl -0777 -i -pe 's{<div[^>]+?class="generic"[^>]*>[^\s]*<small>[^\s]*Author.*?</div>.*?</div>.*?</div>.*?</div>.*?</div>}{}gsmi;' $file`;

    `perl -0777 -i -pe 's{<script[^>]+?src="javascript.*?"[^>]*>.*?</script>}{}gsmi;' $file`;

    `perl -p -i -e 's/.css.html/.css/g;' $file`;
}
@files=;
foreach$file(@files){
`perl-0777-i-pe的{]+?id=“user info”[^>]*>.}{}gsmi;'$file`;
`perl-0777-i-pe的{]+?class=“generic”[^>]*>[^\s]*[^\s]*作者。*?*?*?*?*?*?*?*?*}{}gsmi;'$file`;
`perl-0777-i-pe的{]+?src=“javascript.*?[^>]*>.*?}{}gsmi;'$file`;
`perl-p-i-e的s/.css.html/.css/g;“$file”;
}
我没有很深的Perl知识,但是脚本运行太慢(每天只更新大约180个文件)

有没有办法加快速度

提前谢谢你


PS:当我在少量文件上测试它时,我发现它的性能要好得多……

从perl调用perl总是比在一个进程中完成所有工作要慢。因此,解决方案可能是

perl -i -pe 'BEGIN { undef $/ }
             s{<div[^>]+?id="user-info"[^>]*>.*?</div>}{}gsmi;
             s{<div[^>]+?class="generic"[^>]*>[^\s]*<small>[^\s]*Author.*?</div>.*?</div>.*?</div>.*?</div>.*?</div>}{}gsmi;
             s{<script[^>]+?src="javascript.*?"[^>]*>.*?</script>}{}gsmi;
             s/.css.html/.css/g;
    ' *.html
perl-i-pe'BEGIN{unde$/}
s{]+?id=“用户信息”[^>]*>.}{}gsmi;
s{]+?class=“generic”[^>]*>[^\s]*[^\s]*作者。*?*?*?*?*?*?*?*}{}gsmi;
s{]+?src=“javascript.*?[^>]*>.*}{}gsmi;
s/.css.html/.css/g;
'*.html

首先,如果您将400000个文件名加载到内存中,这将占用一些内存。您可以通过以下方式轻松地遍历文件列表:

  • 文件::查找
  • opendir
    +
    while(readdir($dh))
    (不加载整个列表)
第二,使用backticks会在shell中产生一个新的进程,这是非常无效的。您可以正常地打开文件,将它们读出来,然后重新打印到相同的文件名。例如

while (my $file = readdir($dh)) {
    open my $fh, "<", $file or die $!;
    local $/;
    my $text = <$fh>;                # slurp file
    $text =~ s/....//g;              # do your substitutions
    open $fh, ">", $file or die $!;
    print $fh $text;                 # overwrite file, same as -i switch does
}
while(my$file=readdir($dh)){
打开我的$fh,“,$file或die$!;
打印$fh$text;#覆盖文件,与-i开关相同
}

最后。。使用正则表达式编辑html并不理想。这可能适用于您的情况,但花一些时间学习html解析器可能是值得的。不确定它是否适合这种特殊情况,但为了使代码更稳定,可能值得研究。

不要使用反勾号。它非常慢。为什么不直接打开文件,进行更改并打印回来呢?你真的在一个目录中有400000个文件,没有子目录吗?这很可能会导致问题,无论你如何访问它们;仅打开一个文件就需要搜索目录。你能设置子目录的层次结构吗?是的,很遗憾,所有子目录都在一个目录中。谢谢!但是打开每个文件,然后将其写回会比只对其应用正则表达式快吗?@user1751343生成一个新的过程来应用正则表达式会慢很多,是的。这就是perl构建的目的,而且速度非常快。如果你怀疑我,你可以随时检查基准模块并测试它。只要试过,它似乎工作得非常快!非常感谢你@用户1751343不客气。是的,perl针对这类事情进行了优化。与之相比,回拍速度慢且笨重。与以前每天180次的速度相比,它完成的速度有多快,这将是一件有趣的事情脚本花了大约6个小时更新所有文件:)这不应该用400.000个字符串填充
@ARGV
?普通的shell甚至支持吗?@amon:您可以在Perl中迭代文件。我试图展示的是如何不从perl调用perl。