在替换模式中,有没有办法在计数器中打印替换号码?
我需要在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>
我有很多行,我希望避免手动输入这些数字。我怎么能这样做,最简单的方法呢?
答案 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>"