【问题标题】:To replace text between tags that span multiple lines by another text in perl用 perl 中的另一个文本替换跨越多行的标签之间的文本
【发布时间】:2012-11-04 06:54:31
【问题描述】:

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

    .
    .
    .

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

    .
    .
    .
    .

我的一段代码sn-p如下:

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;
}

'.*' 仅当开始标签和结束标签在同一行时才有效。

【问题讨论】:

  • 如果文件不是很大,将其加载到字符串并替换正则表达式,而不是保存,如果文件很大,则需要使用标志变量,这将指示是否应该替换文本中的指针。 .. 编程没有单一的思考?
  • 您考虑过使用 XML 解析器吗? CPAN 有很多用于处理 XML 的工具。

标签: xml perl xml-parsing


【解决方案1】:

parse HTML/XML with regexes不行。正如@mu 提到的,尝试使用 XML 解析器 - 例如,您可以使用 XML::Simple 实现您想要的。

看看教程XML for Perl developers, Part 1: XML plus Perl -- simply magic

它比您需要的要多,但会为您提供在 Perl

使用 XMLs 的一个很好的介绍

【讨论】:

    【解决方案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 ;
    

    【讨论】:

      【解决方案3】:

      虽然使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-02
        • 1970-01-01
        • 2016-03-29
        • 2015-11-19
        • 2021-07-21
        • 2011-06-01
        • 2014-04-14
        相关资源
        最近更新 更多