Monster Perl Regex - PullRequest
       10

Monster Perl Regex

0 голосов
/ 29 июля 2010

Я пытаюсь изменить строки следующим образом:

<a href='../Example/case23.html'><img src='Blablabla.jpg'

К этому:

<a href='../Example/case23.html'><img src='<?php imgname('case23'); ?>'

И у меня есть этот монстр с регулярным выражением:

find . -type f | xargs perl -pi -e \
  's/<a href=\'(.\.\.\/Example\/)(case\d\d)(.\.html\'><img src=\')*\'/\1\2\3<\?php imgname\(\'\2\'); \?>\'/'

Но это не работает. На самом деле, я думаю, что это проблема с Bash, на которую, вероятно, можно было бы указать довольно быстро.

r: line 4: syntax error near unexpected token `('
r: line 4: `  's/<a href=\'(.\.\.\/Example\/)(case\d\d)(.\.html\'><img src=\')*\'/\1\2\3<\?php imgname\(\'\2\'); \?>\'/''

Но если вы хотите помочь мне с регулярным выражением, это тоже было бы здорово!

Ответы [ 5 ]

2 голосов
/ 29 июля 2010

Учим, как ловить рыбу:

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'\''); ?>'\''}'
1 голос
/ 29 июля 2010

Одиночные кавычки в одинарных кавычках в Bash:

set -xv
echo ''"'"''
echo $'\''
1 голос
/ 29 июля 2010

Одиночные кавычки Bash не допускают никаких побегов.

Попробуйте это в приглашении bash, и вы поймете, что я имею в виду:

FOO = '\' foo '

заставит вас искать четвертыйодинарные кавычки.Если вы его удовлетворите, вы обнаружите, что значение FOO равно

\ foo

. Вы должны будете использовать двойные кавычки вокруг своего выражения.Хотя на самом деле ваш HTML должен использовать двойные кавычки.

0 голосов
/ 29 июля 2010

если вы устанавливаете пакет mysql, он поставляется с командой replace.

С помощью команды replace вы можете:

while read line 
do
 X=`echo $line| replace "<a href='../Example/"  ""|replace ".html'><" " "|awk '{print $1}'`
 echo "<a href='../Example/$X.html'><img src='<?php imgname('$X'); ?>'">NewFile   
done < myfile

То же самое можно сделать с помощью sed.sed s / 'my string' / 'replace string' / g .. replace просто работать со специальными символами.

0 голосов
/ 29 июля 2010

Я бы не использовал однострочник.Поместите свой Perl-код в скрипт, который значительно упрощает правильное выражение, не задумываясь о экранировании кавычек и т. П.

Я бы использовал такой скрипт:

#!/usr/bin/perl -pi

use strict;
use warnings;

s{
    ( <a \b [^>]* \b href=['"] [^'"]*/case(\d+)\.html ['"] [^>]* > \s*
      <img \b [^>]* \b src=['"] ) [^'"<] [^'"]*
}{$1<?php imgname('case$2'); ?>}gix;

а затем сделать что-то вроде:

find . -type f | xargs fiximgs

- Майкл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...