如何在文件夹中的所有文件中执行文本替换?

时间:2011-03-18 13:24:04

标签: windows perl text replace

我需要在一大组.xml文件中更新单个参数。我在windows命令行中阅读并使用了一行perl,我可以让它一次替换一个文件,但我很难让perl一次完成所有文件。

perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g;" test.xml

当我尝试将其更改为

时,这是有效的
perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g;" *.xml

我得到“无法打开* .xml:无效的参数”

perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g;" .xml

给我“无法打开.xml:没有这样的文件或目录”

我试图看看是否可以使用system()在另一个perl脚本中调用它,但是这似乎与使用引号有关,并且可能不是最好的方法。

要点:

问题 - 我有大量的.xml文件,我想在其中更改单个参数。我必须能够在Windows机器上执行此操作,理想情况下,我希望努力使解决方案能够在脚本中自动执行此操作,以便我可以循环执行多个参数值替换(通过调用单独的程序,将.xml文件作为替换之间的输入。)

感谢您提供的任何帮助。

6 个答案:

答案 0 :(得分:3)

当我这样做时,我通常使用以下模式:

ls *.xml | xargs perl -i.bak -p -e "s/<search>/<replace>/g"

在Windows上,您应该能够使用以下模式:

for %f in (*.xml) do perl -i.bak -p -e "s/<search>/<replace>/g" "%f"

有关详细信息,请参阅Perl 5 by Example: Using the -n and -p Options

答案 1 :(得分:3)

您可以在for脚本中使用.cmd循环。类似的东西:

for %%a in (*.xml) do (
  perl -i.bak ... %%a
)

这是一个方便的cmd.exe reference

答案 2 :(得分:3)

试试这个:

  

for / r%i in(* .xml)do perl -pi.bak -e“s /(\ d +。\ d + E- \ d +)/ 2.2E-6 / g;” %I

答案 3 :(得分:1)

use File::Find;

更新:你可以使用这个单行:

perl -we 'use File::Find; my $dir = shift; find (sub { $_=~ /\.xml$/i and system @ARGV, $_ }, $dir)' <dir> <other-one-liner>

答案 4 :(得分:1)

问题是,Windows的借口不会进行文件名通配(将* .xml扩展到所有扩展名为.xml的文件中)。

由于shell不会为你做,所以你必须自己动手。

这很容易在Perl中完成,但它需要在“内部”代码开始之前完成,所以把它放到BEGIN块中:

perl -pi.bak -e "BEGIN{@ARGV=glob shift} s/(\d+\.\d+E-\d+)/2.2E-6/g;" *.xml

答案 5 :(得分:0)

find . -type f -name *.xml | xargs perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g;

这将传递所有文件。 (递归地)将 .xml 与perl命令匹配,一次一个。