REGEX模式增加替换的计数器

时间:2012-03-21 15:49:48

标签: ruby regex perl sed

在替换模式中,有没有办法在计数器中打印替换号码?

我需要在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 个答案:

答案 0 :(得分:1)

你可以写:

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

使用/e标志将替换视为表达式而不是字符串。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

使用awk

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

<强>输出

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

我希望这会有所帮助。

答案 3 :(得分:0)

perl -pwe 's/<p\s+\Kclass-"foo">/ $i++; qq(id="$i">) /e' yourfile

\K用于保留前面的内容,在这种情况下很方便。使用已评估的替换并包含多个(两个)语句也很方便,以避免连接和引用复杂化。它只是插入的整个语句的返回值,即最后一个语句。

当您尝试并想要更改文件时,您只需添加-i选项即可。我建议使用备份,如下所示:

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

(在filename.ext.bak备份)

答案 4 :(得分:0)

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>"