在Windows上使用正则表达式编辑目录树中的所有文件

时间:2016-12-29 23:48:36

标签: regex windows perl

我正在寻找一个可以编辑目录树中所有文件的程序,比如Unix系统上的Perl。这些文件是xml和另一个文件夹。

正则表达式应删除放置在<loot></loot>括号中的所有内容。

例如文件

<?xml version="1.0" encoding="UTF-8"?>
<monster name="Dragon"/>
<health="10000"/>
<immunities>
    <immunity fire="1"/>
</immunities>
<loot>
<item id="1"/>
<item id="3"/>
    <inside>
        <item id="6"/>
    </inside>
</item>
</loot>

文件应该在编辑之后:

<?xml version="1.0" encoding="UTF-8"?>
<monster name="Dragon"/>
<health="10000"/>
<immunities>
    <immunity fire="1"/>
</immunities>
<loot>
</loot>

1 个答案:

答案 0 :(得分:1)

我会回避基于正则表达式的任何东西 - XML根本不适用于正则表达式。

但幸运的是,Perl for Windows随时可用。更好的是,如果你使用Strawberry perl,它会与XML::TwigXML::LibXML捆绑在一起。

此时问题变得非常简单:

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

use File::Find::Rule;
use XML::Twig;

sub delete_loot {
   my ( $twig, $loot ) = @_;
   foreach my $loot_entry ( $loot -> children ) {
      $loot_entry -> delete;
   }
   $twig -> flush;
}

my $twig = XML::Twig -> new ( pretty_print => 'indented', 
                              twig_handlers => { 'loot' => \&delete_loot ,
          '_all_' => sub { $_ - > flush } } ); 

foreach my $file ( File::Find::Rule  -> file()
                                     -> name ( '*.xml.txt' )
                                     -> in ( 'C:\tmp' ) ) {

    print "Processing $file\n";
    $twig -> parsefile_inplace($file); 
}

当然,这个假设您的XML实际上是XML - 您的示例并非如此。如果这个例子实际上是正确的,那么你应该真正击中那些用XML规范的卷起来编写它的人,同时唱颂“不要制作假的XML&#39;”。