在perl中用另一个文本替换跨多行的标记之间的文本

时间:2012-11-04 06:54:31

标签: xml perl xml-parsing

我需要将文件中的标记(<stats>...</stats>)之间的多行文本替换为Perl中其他文件中的另一个多行文本。我正在使用搜索和替换功能但目前无法正常工作。如果开始标记和结束标记都在同一行,那么我可以替换它们,否则它不会被替换。对于Ex,在目标文件中:

    .
    .
    .

    <stats>
    <stat type="string" value="a" />
    <stat type="string" value="b" />
    <stat type="string" value="c" />
    <stat type="string" value="d" />
    </stats>

    .
    .
    .
    .

我的代码段的一部分如下:

my $replacetext="<stats>"."@lines"."</stats>";
my $searchtext="<stats>.*</stats>";

# Here @file_lines is the array containing destination file and  @lines is the array containing source file.

foreach (@file_lines) 
{
      $_=~ s/$searchtext/$replacetext/g;
}
仅当起始标记和结束标记位于同一行时,

'.*'才有效。

3 个答案:

答案 0 :(得分:3)

<{3}} 不正常。正如@mu所提到的,尝试使用XML解析器 - 例如,您可以使用parse HTML/XML with regexes实现所需的目标。

查看教程XML::Simple

这比您需要的更多,但会为您提供 Perl

使用XML 的良好介绍

答案 1 :(得分:2)

不要使用正则表达式来解析XML。使用XML解析器。

使用XML::XSH2的示例,XML::LibXML的包装:

my $source ;
$source = { open my $SOURCE, '<', 'source.xml' or die $! ; local $/ ; <$SOURCE> } ;
open destination.xml ;
for //stats {
    rm ./* ;
    insert chunk $source into . ;
}
save :b ;

答案 2 :(得分:1)

虽然使用XML库通常是正确的做法,但是如果文件不是太大并且您不希望实际解析和遍历的开销,您仍然可以快速而肮脏的方式执行此操作。 XML(例如,只需要很小的更改)。但是,这样做非常脆弱

my $joined_file = join "\n", @file_lines;          # one long multi-line string
$joined_file =~ s/$searchtext/$replacetext/sg;     # s means multi-line
my @updated_file_lines = split /\n/, $joined_file; # result