2015-08-26 105 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 

閱讀,寫作和解析文件只有一次肯定會比做了很多次快得多。