补丁替换整行还是仅替换行中的字符并不重要(最终结果是相同的,不是......?),但我不认为这是一个“补丁”问题。有关使用“sed”的更简单的解决方案,请参见下文。
例如,假设:
$ cat f1.txt
<xml>
<foo:ListeningPortBar>3423</foo:ListeningPortBar>
</xml>
$cat f2.txt
<xml>
<cat:LoremIpsum>3423</cat:LoremIpsum>
</xml>
然后,从字面上看,补丁将是:
$ diff -u f1.txt f2.txt
--- f1.txt 2012-07-08 03:14:39.328328048 -0700
+++ f2.txt 2012-07-08 03:14:30.618177130 -0700
@@ -1,3 +1,3 @@
<xml>
-<foo:ListeningPortBar>3423</foo:ListeningPortBar>
+<cat:LoremIpsum>3423</cat:LoremIpsum>
</xml>
此补丁文件可用作模板,为所有需要更新的文件使用正确的值进行修改,并单独应用于所有文件。这听起来比必要的工作更多。
另一方面,只需使用“sed”:
$ sed 's/<foo:ListeningPortBar>\([0-9]*\)<\/foo:ListeningPortBar>/<cat:LoremIpsum>\1<\/cat:LoremIpsum>/' f1.txt
<xml>
<cat:LoremIpsum>3423</cat:LoremIpsum>
</xml>
由于您拥有 XML,因此使用 xsltproc是另一种选择,但对于这个简单的搜索和替换任务来说,这又可能是多余的。
要在脚本中使用它,您可以执行以下操作(用上面的 sed 替换“etc/etc”):
for f in $(find dir -name "*.xml" -exec egrep 'foo:ListeningPortBar' {} \; -print)
do
sed -i.bak 's/etc/etc/g' $f
done
...然后验证“.bak”文件实际上与修改后的文件不同。