2017-07-02 106 views
1

在我的Windows 10中,我在同一目录下有100多个XML文件,它们包含相同的标记,例如<Number>,其内容不同,如<Number>4564564</Number><Number>7777</Number>Windows - 使用script:sed of bash或cmd batch在一堆文件中查找/替换XML标记中的内容?

现在,我想用123456替换所有不同的值。

我安装了Git bash,找到sed可能是有用的。但是,AFAIK,forbash不能在一个目录下迭代文件,并且我知道没有其他方式在bash中迭代文件,而是在Windows批处理文件中可以使用FOR(如果我错了,请纠正我)。所以,

  • 我可以重复使用批量FOR和循环,使用bash的sed,即混合GNU的bash命令和CMD命令?当我测试它似乎不可能。
  • 如果以前是不可能的,我可以做它,或在纯bash脚本,或纯批量?

什么我已经是这样的批次:

@echo on 
setlocal ENABLEEXTENSIONS 
set here=%cd% 
for /R %here% %%G in (*.xml) do (
    echo %%G 
    for /F "skip=2 tokens=* " %%H in (%%G) do (
     echo %%H | sed -r 's:<Number>([0-9]+)</Number>:<Number>123456</Number>:' 
    ) 
) 
endlocal 

运行此批处理中cmd和Git的bash给了我同样的错误:

The system cannot find the path specified. 

我已经安装了Git的bash和明显,可以在Git bash和cmd中找到sed.exe。在cmdsed --version给我:

sed (GNU sed) 4.2.2 
... 

回答

1

这将是一个纯sed解决方案:

sed -r 's:<Number>([0-9]+)</Number>:<Number>123456</Number>:' -i *.xml 

(注意,sed可以对多个文件进行操作,在序列中的-i标志指示做的事。就地编辑)。

如果您需要做其他事情,您可以使用此纯文件循环播放文件bash + sed脚本:

for file in *.xml; do 
    echo "Processing file: $file" 
    sed -r 's:<Number>([0-9]+)</Number>:<Number>123456</Number>:' -i "$file" 
    # ... 
done 
+0

伟大的解决方案,在这里工作!现在我想知道哪些批量爱好者会说... – FaithReaper

+0

我不确定批量爱好者,但PowerShell爱好者会说使用['Get-Content .. -replace'](https://stackoverflow.com/questions/ 17144355 /何灿我替换,每一个现期的一串-IN-A-文件与-PowerShell的)。 Unix爱好者会说:过来,我们有(更多)cookies。 :) – randomir