2015-08-26 2 views
1

В качестве части более широкого скрипта я использую ряд команд perl -pi, чтобы избавиться от различных артефактов и ошибок в LaTeX.Ускорьте ряд команд 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

Awesome - есть что-то странное в статусе присоединения? Я получаю «Недостаточно аргументов для соединения или строки на -e строке 12, на EOF BEGIN небезопасно после ошибок - компиляция отменена на -e строке 12.» :( – Joe

+0

@Joe, Bad цитата с моей стороны. Используется '' 'внутри' 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 

Чтение, запись и разбор файлов только один раз будет намного быстрее, чем делать это много раз.

Смежные вопросы