Perl-скрипт для рекурсивной замены всех тегов <h2> на <h1> во всех файлах - PullRequest
2 голосов
/ 12 марта 2012

Так что-то вроде этого

<h2 style='margin-top: 10px;'>
<?php echo $title; ?>
</h2>

должно стать

<h1 style='margin-top: 10px;'>
<?php echo $title; ?>
</h1>

Я использую этот код perl -pi -e 's/<h2(.*)<\/h2>/<h1\1<\/h1>/g' *, но он работает, только если теги находятся в одной строке.

Ответы [ 5 ]

4 голосов
/ 12 марта 2012

Нет необходимости сочетать открывающий и закрывающий теги. Просто измените все открывающие теги <h2> на '`, а затем сделайте то же самое для всех закрывающих тегов. Как это

perl -pie 's|<h2\b|<h1|g; s|</h2\b|</h1|g;' *
2 голосов
/ 12 марта 2012
perl -pi.bak -we 's#</?h\K2#1#g' yourfile

\K сохранит сопоставленный текст перед ним.Таким образом, мы не должны возвращать его после сопоставления.

1 голос
/ 12 марта 2012

Нет * nix среды для тестирования, но

% find . -name "*.html" -exec sed -e s/\<h2/\<h1/g -e 's|</h2|</h1|g' {} \;

может начать вас. Perl не требуется.

0 голосов
/ 12 марта 2012

Ниже у меня работает код

use strict;
use warnings;

open FILE, 'inputfile.txt';

my $contents = do { local $/; <FILE> };

close FILE;

$contents =~ s/<h2(.*?)<\/h2>/<h1$1<\/h1>/sg;

print $contents;

Обратите внимание, что $/ является разделителем входных записей. По умолчанию это перевод строки \n.
Мы создаем локализованную версию $/, поэтому ее предыдущее значение восстанавливается после завершения блока.

0 голосов
/ 12 марта 2012

Вы можете использовать Perl следующим образом:

perl -0pe -i.bak 's#<h2(.*?)</h2>#<h1$1</h1>#gs' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...