Шаблон REGEX для увеличения счетчика замен - PullRequest
0 голосов
/ 21 марта 2012

В шаблоне замены есть ли способ напечатать НОМЕР замены, как в счетчике?

У меня есть ряд блоков кода, которые мне нужно обработать в файле HTML, но в каждом замененном блоке мне нужно увеличить счетчик на 1.

Итак

<p class-"foo">Some text</p>
<p class-"foo">Other text</p> 

должно быть

<p id="1">Some text</p>
<p id="2">Other text</p> 

У меня много строк, я бы не хотел вводить эти цифры вручную. Как я могу сделать это, самый простой способ?

Ответы [ 5 ]

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

Вы можете написать:

perl -pe 's/<p class-"foo">/"<p id=\"" . (++$count) . "\">"/eg'

с использованием флага /e для обработки замены как выражения, а не строки.

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

В Perl:

my $html = <<END;
<p class="foo">Some text</p>
<p class="foo">Other text</p> 
END

my $n = 0;
$html =~ s/<p class="toc0">/'<p class="foo" id="'.++$n.'">'/eg;

print $html;

ВЫХОД

<p id="1">Some text</p>
<p id="2">Other text</p> 

Для версии командной строки для чтения из файла

perl -pe 's/<p class="toc0">/q(<p class="foo" id=").++$n.q(">)/eg' myfile.html
0 голосов
/ 21 марта 2012
irb(main):001:0> s = %Q{<p class-"foo">Some text</p>\n<p class-"foo">Other text</p>}
irb(main):002:0> id=0; s.gsub(/class-"foo"/) { id+=1; %Q[id="#{id}"] }
=> "<p id=\"1\">Some text</p>\n<p id=\"2\">Other text</p>"
0 голосов
/ 21 марта 2012
perl -pwe 's/<p\s+\Kclass-"foo">/ $i++; qq(id="$i">) /e' yourfile

\K используется для хранения того, что предшествует, что удобно в этом случае.Использование замены, которая оценивается и содержит несколько (два) операторов, также удобно, чтобы избежать объединения и усложнения цитирования.Вставляется только возвращаемое значение всего оператора, т.е. последний оператор.

Когда вы опробовали его и хотите изменить файлы, вы можете просто добавить параметр -i.Я бы рекомендовал использовать резервные копии, например, так:

perl -i.bak -pwe '....etc'

(Резервное копирование в filename.ext.bak)

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

используйте awk

{ cat -<<EOS
  <p class-"foo">Some text</p>
  <p class-"foo">Other text</p> 
EOS
} | awk '/<p class/{sub(/class-".*"/, "id=\""++i "\"");print}'

output

<p id-1>Some text</p>
<p id-2>Other text</p>

Надеюсь, это поможет.

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