如何迭代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;
答案 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;