2015-08-26 104 views
1

作为一个更广泛的脚本,我用了一系列的perl -pi命令来摆脱乳胶各种文物和mistypings的一部分。加快了一系列的perl -pi命令

的片段是这样的:

perl -pi -e "s/”/\''/g" *.txt 
perl -pi -e "s/“/\`\`/g" *.txt 
perl -pi -e "s/,/, /g" *.txt 
perl -pi -e "s/ ,/,/g" *.txt 
perl -pi -e "s/ !/!/g" *.txt 
perl -pi -e "s/\&/ and /g" *.txt 
perl -pi -e "s/\n/\n\n/g" *.txt 
perl -pi -e "s/\\\\em/\\\\em /g" *.txt 
perl -pi -e "s/’/'/g" *.txt 
perl -pi -e "s/\*\*\*/\\\\split/g" *.txt 

* .TXT约为50-80文件和这个片断接受一个令人惊讶的长时间运行 - 我怀疑把套入适当的perl脚本将改善效力。我的问题是:perl中的哪些方法对于一组简单替换具有最快的执行时间?

回答

3
perl -i -pe' 
    s/”/\x27\x27/g; 
    s/“/``/g; 
    s/,/, /g; 
    ... 
' *.txt 

但是,这仍然扫描每一行一百万次。以下避免:

perl -i -pe' 
    BEGIN { 
     %tr = (
     "”" => "\x27\x27", 
     "“" => "``", 
     "," => ", ", 
     ... 
    ); 
     $pat = join "|", map quotemeta, keys(%tr); 
    } 
    s/($pat)/$tr{$1}/g; 
' *.txt 
+0

太棒了 - 有没有关于加入声明的奇怪事情?我得到“没有足够的论据加入或-e线12串,在EOF BEGIN不安全错误后 - 编译在-e行12中止” :( – Joe

+0

@Joe,坏引用我的一部分。用'“''的Perl的-e里面” ...''没有正确转义它。固定 – ikegami

+0

顺便说一句,我用'\ x27'和'“'代替的'“',因为它们比'更具可读性”“”'或者''“”‘',否则将需要逃避'’' – ikegami

2

您可能希望更换一次通过,而不是十个,

script.pl


s/”/\''/g; 
    s/“/\`\`/g; 
    s/,/, /g; 
    s/ ,/,/g; 
    s/ !/!/g; 
    s/\&/ and /g; 
    s/\n/\n\n/g; 
    s/\\\\em/\\\\em /g; 
    s/’/'/g; 
    s/\*\*\*/\\\\split/g; 

执行脚本,

perl -pi script.pl *.txt 
+0

你可能逃脱不逃避撇号和反引号。 –

+0

@JimDavis是的,我可以,但它只是复制/粘贴。 –

1

只要把所有替换成单线:

perl -pi -e "s/”/\''/g; s/“/\`\`/g; s/,/, /g; s/ ,/,/g; s/ !/!/g; s/\&/ and /g; s/\n/\n\n/g; s/\\\\em/\\\\em /g; s/’/'/g; s/\*\*\*/\\\\split/g" *.txt 

阅读,写作和解析文件只有一次肯定会比做了很多次快得多。