我需要在一大组.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文件作为替换之间的输入。)
感谢您提供的任何帮助。
答案 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"
答案 1 :(得分:3)
答案 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命令匹配,一次一个。