Глобальное подстановка регулярных выражений с уникальными произвольными значениями - PullRequest
0 голосов
/ 14 октября 2011

У меня есть один огромный HTML-файл со многими ссылками, т.е. <a href="...">. Мне нужно заменить каждое href уникальным произвольным значением. Итак, после замены первая ссылка будет <a href="http://link1">, вторая ссылка <a href="http://link2"> и т. Д.

Можем ли мы сделать это с помощью регулярных выражений? Или мне нужно написать небольшой скрипт для сканирования файла? В идеале решением должен быть скрипт на Perl или bash (а не что-то проприетарное).

Спасибо.

Ответы [ 3 ]

2 голосов
/ 14 октября 2011

Perl - это, вероятно, ваша лучшая ставка, но я бы не стал делать это за одно регулярное выражение (возможно, это даже невозможно). Я думаю, что это настолько короткий, насколько вы можете сделать сценарий, все еще делая его читабельным:

#!/usr/bin/perl
$link = 1;
while(<>) {
    $link++ while( s/href="(?!link\d)[^"]*"/href="link$link"/ );
    print;
}

Тогда назовите это так:

./thatScript.pl inputFile.html > newInputFile.html

Он проверяет каждую строку ввода и для каждого href="..." находит, заменяет ее пронумерованной ссылкой и увеличивает номер ссылки. Существует также негативный взгляд на то, чтобы не заменять один и тот же href непрерывно.

РЕДАКТИРОВАТЬ: Просто, черт возьми, вот как вы могли бы сжать вышесказанное в одну строку bash:

perl -pe '$link++ while( s/href="(?!link\d)[^"]*"/href="link$link"/ )' inFile.html > outFile.html

Это использует удивительный флаг -p в Perl, как объяснено здесь .

1 голос
/ 14 октября 2011

Я определенно не рекомендую это (tchrist прав, конечно, это должен быть сценарий), но он обладает преимуществом краткости и выполнения буквальных требований детерминистическим / повторяемым способом без необходимости сохранять состояние / отображение.

perl -MDigest::MD5=md5_hex -MXML::LibXML -le '$d = XML::LibXML->load_html( location => shift || die "need location" ); for $a ( $d->findnodes("//\@href") ) { $a->setValue( md5_hex $a->value ) }; print $d->serialize' targeted.html
0 голосов
/ 14 октября 2011

не проверено:

perl -pe 's{(href=")[^"]+}{$1 . "http://link" . ++$count}ge' filename > newfile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...