查找 - 替换字符串的多次出现并附加迭代编号

时间:2016-05-20 19:28:38

标签: regex perl

如何迭代html文件的代码并查找某些重复文本,然后附加一个单词并迭代编号。

So: 
<!-- TemplateBeginEditable -->
<!-- TemplateBeginEditable -->
<!-- TemplateBeginEditable -->   
etc...                    

Becomes :
<!-- TemplateBeginEditable Event=1 -->
<!-- TemplateBeginEditable Event=2 -->
<!-- TemplateBeginEditable Event=3 -->
etc...

我已经尝试过PERL,认为它是最简单/最快的,然后转到jQuery然后再回到PERL。

使用REGEX查找/替换多种方式并返回一组出现的内容似乎很简单,但是获得迭代变量的证明更具挑战性。

我尝试过的最新例子:

#!/usr/bin/perl -w

# Open input file 
open INPUTFILE, "<", $ARGV[0] or die $!;
# Open output file in write mode
open OUTPUTFILE, ">", $ARGV[1] or die $!;

# Read the input file line by line
while (<INPUTFILE>) {
  my @matches = ($_ =~ m/TemplateBeginEditable/g);
  ### what do I do ith matches array? ###
  $_ =~ s/TemplateBeginEditable/TemplateBeginEditable Event=/g;
  print OUTPUTFILE $_; 

}


close INPUTFILE;
close OUTPUTFILE;

4 个答案:

答案 0 :(得分:1)

要执行替换,您不需要匹配之前的模式,您可以直接执行替换。代码示例:

while (<INPUTFILE>) {
    s/TemplateBeginEditable/TemplateBeginEditable Event=/g;
    print OUTPUTFILE $_; 
}

现在要在每次替换时添加一个递增的计数器,您可以使用以下语法在模式中放入一段代码:

my $i;

while (<INPUTFILE>) {
    s/TemplateBeginEditable(?{ ++$i })/TemplateBeginEditable Event=$i/g;
    print OUTPUTFILE $_; 
}

为了缩短比例,您可以使用\K功能更改匹配结果的开头:

while (<INPUTFILE>) {
    s/TemplateBeginEditable\K(?{ ++$i })/ Event=$i/g;
    print OUTPUTFILE $_; 
}

或使用单行:

perl -pe 's/TemplateBeginEditable\K(?{++$i})/ Event=$i/g' file > output

答案 1 :(得分:1)

如果您有awk可用,并且目标文本每行最多只出现一次,那么我觉得Perl太过分了:

awk 'BEGIN{n=1}{n+=sub("TemplateBeginEditable","& Event="n)}1'

一些解释:sub函数返回执行的替换次数(0或1); &表示“匹配的任何东西”; "..."n是字符串连接(awk中没有运算符); 1是一个“真实”条件,可调用{print}的默认“操作”。

答案 2 :(得分:0)

在评论中扩展我的单行:

#!/usr/bin/perl
use strict;
use warnings;

my $file = shift or die "Usage: $0 <filename>\n";

open my $fh, '<', $file or die "Cannot open $file: $!\n";
open my $ofh, '>', "$file.modified" or die "Cannot open $file.modified: $!\n";

my $i = 1;
while (my $line = <$fh>) {
   if ($line =~ s/TemplateBeginEditable/$& Event=$i/) {
      $i++;
   }
   print $ofh $line;
}

__END__

请注意,这假设您在一行中永远不会有多个所需文本的实例,如示例输入中所示。

答案 3 :(得分:0)

我只是这样做:

local $/=undef;
my $content = <FH>;
my $x = 0;
$content =~ s/(My expected pattern)/$1 . " time=" . (++$x)/ge;
相关问题