在多个XML文件中批量查找和替换

在多个XML文件中批量查找和替换,xml,replace,find,notepad++,Xml,Replace,Find,Notepad++,我需要在700多个XML文件上查找并替换以下文件: <base>7.4</base> 7.4 需要成为 <base>7.2</base> 7.2 但是,我必须使用的唯一工具是Notepad++,当我尝试执行“在文件中替换”功能时,它会不断崩溃。是否有其他简单的方法来执行此批量查找和替换?我不太擅长编码,但它们都在同一个文件夹中,也许有一种方法我可以使用.bat文件来运行它们?任何关于做什么或如何写作的建议都将不胜感激 提前感谢, Colet

我需要在700多个XML文件上查找并替换以下文件:

<base>7.4</base>
7.4
需要成为

<base>7.2</base>
7.2
但是,我必须使用的唯一工具是Notepad++,当我尝试执行“在文件中替换”功能时,它会不断崩溃。是否有其他简单的方法来执行此批量查找和替换?我不太擅长编码,但它们都在同一个文件夹中,也许有一种方法我可以使用.bat文件来运行它们?任何关于做什么或如何写作的建议都将不胜感激

提前感谢,


Colette

XML处理起来很烦人,因为虽然它看起来像纯文本,但实际上却不是。因此,使用“基于文本”的模式匹配来取代它并不理想,因为。。。好吧,你可以破坏它的格式。我个人建议:

  • 下载perl(如activestate社区版)
  • 安装
    XML::Twig
    模块(ppm安装
    XML::Twig
  • 使用下面的脚本-在命令行上指定要更改的文件(例如
    thisscript.pl file1.xml file2.xml file3.xml
像这样


您可以从下载PowerGREP的免费试用版

然后:

  • 使用左侧的导航器浏览到包含文件的文件夹
  • 选择
    Search and replace
    作为操作类型
  • 在搜索框中输入
    7.4
  • 替换中的输入
    7.2
  • 预览搜索,确保选择了正确的文件
  • 单击“替换”
  • 输入值并单击预览

    建议更改的预览亮点

    单击“替换”

    文件已更改


    使用python(2或3,没关系)。你还需要这个问题的答案吗?谢谢你的建议,但如果我必须指定每个文件名,这几乎同样乏味。我不希望他们将结果保存到新文件中,只需修改旧文件即可。我有一个文件夹,里面有500个文件。我只需要在每个文件中搜索7.4并替换为7.2。不确定这是否容易实现。您确实发现可以设置输入和输出文件名,对吗?无法在Windows上进行在位编辑。这是行不通的,但你可以先重命名旧文件。@Sobrique当然,你可以在Windows上编辑文件,而无需复制。您不会真的认为Word和任何其他文本编辑器会创建修改文件的副本:-)
    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    use XML::Twig;
    
    sub replace_base {
        my ( $twig, $base ) = @_;
        if ( $base->text eq "7.2" ) {
            $base->set_text("7.4");
        }
    }
    
    #iterate the files on the command line
    foreach my $filename (@ARGV) {
    
        #set up the processor
        my $twig = XML::Twig->new(
            #output formatting
            'pretty_print'  => 'indented_a',
            #every time a 'base' element is encountered, run replace_base on it. 
            'twig_handlers' => { 'base' => \&replace_base }
        );
        #process this file
        $twig->parsefile($filename);
    
        #save the results to a '.new' file. 
        open( my $output, ">", "$filename.new" ) or die $!;
        print {$output} $twig->sprint;
        close($output);
    }