Ruby 用于在替换时递增计数器的正则表达式模式
在替换模式中,是否有任何方法可以像在计数器中一样打印替换编号 我需要在HTML文件中处理一系列代码块,但在每个替换的代码块中,我需要将计数器增加1 所以Ruby 用于在替换时递增计数器的正则表达式模式,ruby,regex,perl,sed,Ruby,Regex,Perl,Sed,在替换模式中,是否有任何方法可以像在计数器中一样打印替换编号 我需要在HTML文件中处理一系列代码块,但在每个替换的代码块中,我需要将计数器增加1 所以 一些文本 其他文本 需要 <p id="1">Some text</p> <p id="2">Other text</p> 一些文本 其他文本 我有很多行,我希望避免手动输入这些数字。最简单的方法是如何做到这一点?使用awk { cat -<<EOS <p class
一些文本
其他文本
需要
<p id="1">Some text</p>
<p id="2">Other text</p>
一些文本
其他文本
我有很多行,我希望避免手动输入这些数字。最简单的方法是如何做到这一点?使用awk
{ cat -<<EOS
<p class-"foo">Some text</p>
<p class-"foo">Other text</p>
EOS
} | awk '/<p class/{sub(/class-".*"/, "id=\""++i "\"");print}'
{cat-您可以编写:
perl -pe 's/<p class-"foo">/"<p id=\"" . (++$count) . "\">"/eg'
perl-pe的//“
”/eg'
使用/e
标志将替换视为表达式而不是字符串。在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;
my$html=
(备份在filename.ext.bak
)irb(main):001:0>s=%Q{一些文本
\n其他文本
}
irb(main):002:0>id=0;s.gsub(/class-“foo”/){id+=1;%Q[id=“#{id}]”)
=>“一些文本
\n其他文本
您的BEGIN块是多余的。++
运算符将一个未定义的变量递增为1。这看起来可以满足我的需要,但为了便于理解,我对代码进行了过度简化。我实际上希望用两个反向引用来替换:
我需要捕获并重新使用href和链接文本。我尝试了此操作,但肯定缺少了一些内容:$html=~s//'
/例如;
我发现它的标点符号放错了地方。谢谢。这个脚本怎么能修改成以文本文件作为输入,而不是像上面那样把文本放进去?@Steve:我已经在我的答案中添加了一个命令行版本。根据你所说的,我认为没有理由捕获并放回你想要保留的部分——只需编辑操作宁
并保持其余部分不变。
perl -pe 's/<p class-"foo">/"<p id=\"" . (++$count) . "\">"/eg'
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
perl -pwe 's/<p\s+\Kclass-"foo">/ $i++; qq(id="$i">) /e' yourfile
perl -i.bak -pwe '....etc'