Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 用于在替换时递增计数器的正则表达式模式_Ruby_Regex_Perl_Sed - Fatal编程技术网

Ruby 用于在替换时递增计数器的正则表达式模式

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

在替换模式中,是否有任何方法可以像在计数器中一样打印替换编号

我需要在HTML文件中处理一系列代码块,但在每个替换的代码块中,我需要将计数器增加1

所以

一些文本

其他文本
需要

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