Учим, как ловить рыбу:
s/…/…/
Используйте в качестве оператора s
разделитель, отличный от /
, поскольку в выражении уже /
.
s{…}{…}
Сократите кавычки с обратной косой чертой, предпочитайте [.]
вместо \.
, потому что мы добавим кавычки позже. Давайте оставим обратную косую черту только для необходимых или важных частей, а именно здесь класс символов цифр.
s{<a href='[.][.]/Example/case(\d\d)[.]html'>…
Захват только переменной части. Не нужно собирать строку позже, если большая часть статична.
s{<a href='[.][.]/Example/case(\d\d)[.]html'><img src='[^']*'}{<a href='../Example/case$1.html'><img src='<?php imgname('case$1'); ?>'}
Используйте $1
вместо \1
для обозначения обратных ссылок. [^']*
означает все до следующего '
.
Чтобы теперь служить аргументом для опции Perl -e
, эта программа должна быть заключена в кавычки. Используйте следующую вспомогательную программу, вы также можете использовать псевдоним или функцию оболочки:
> cat `which shellquote`
#!/usr/bin/env perl
use String::ShellQuote qw(shell_quote); undef $/; print shell_quote <>
Запустите его и вставьте тело программы, завершите ввод с помощью Ctrl + d , вы получите:
's{<a href='\''[.][.]/Example/case(\d\d)[.]html'\''><img src='\''[^'\'']*'\''}{<a href='\''../Example/case$1.html'\''><img src='\''<?php imgname('\''case$1'\''); ?>'\''}'
Соедините это с конвейером оболочки.
find . -type f | xargs perl -pi -e 's{<a href='\''[.][.]/Example/case(\d\d)[.]html'\''><img src='\''[^'\'']*'\''}{<a href='\''../Example/case$1.html'\''><img src='\''<?php imgname('\''case$1'\''); ?>'\''}'