我一直在尝试使它工作但没有运气。这是我的文本文件(first.txt)
<metric>
<baseFilter>
<and>
<or>
<value field="id">1111</value>
<value field="id">2222</value>
</or>
<or>
<value field="resolution" />
</or>
</metric>
我想用第二个文本文件(second.txt)的这些字符串替换第一个“ or”和“ / or”之间的字符串。我可以在第一个“或”和“ /或”之间有50条或更多条值字段行,因此,我正在搜索“或”和“ /或”之间的字符串,并用second.txt中的任何内容替换。
<value field="id">3333</value>
<value field="id">4444</value>
<metric>
<baseFilter>
<and>
<or>
<value field="id">3333</value>
<value field="id">4444</value>
</or>
<or>
<value field="resolution" />
</or>
</metric>
我已经获得了以下perl代码。
#!/usr/bin/perl
my $first = 'first.txt';
open (my $fh, '<', $first) or die "cannot open file $first";
{
local $/;
$first = <$fh>;
}
$find = "([\s]+)(<or>)([\n\r\s]+).*(\n|.)+?([\n\r\s]+)(<\/or>)";
my $content = 'second.txt';
open (my $fh, '<', $content) or die "cannot open file $content";
{
local $/;
$content = <$fh>;
}
$first =~ s/$find/$1$2$3$content$5$6/;
print "After sub First is $first\n\n";
当我运行代码时,不会发生替换,并且我的$ first保持不变,即first.txt再次出现。我想念什么?我在在线正则表达式测试器(例如http://www.regexr.com/)中使用了正则表达式,我的正则表达式匹配第一个“或”和“ /或”之间的多行字符串。为什么perl不喜欢我的正则表达式?
通过捕获所有这些XML片段,您使比赛中的事情变得过于复杂。以下正则表达式是执行替换的一种简单得多的方法:
$first =~ s#(<or>\s+)<value field="id">.*?</value>(\s*</or>)#$1$content$2#sm;
我使用了修饰符s
和m
,它们可以匹配多行,并允许.
包含换行符。因此我们可以替换<or>
开始标记和结束标记之间的任何数量的行。我还使用#
了正则表达式的分隔符,因此不必费力在XML close标记中转义斜线。
有关正则表达式(尤其是修饰符)的更多信息,请参见perlre。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句