是否可以创建一个将自己编辑行而不是替换整行的差异补丁文件?
例如,我有以下行:
<foo:ListeningPortBar>3423</foo:ListeningPortBar>
我想将其更改为:
<cat:LoremIpsum>3423</cat:LoremIpsum>
也就是说,我想更改实际端口号周围的文本,但保留端口号 - 我需要将此补丁应用于多个文件,所有文件都具有不同的端口号 - 我只想更改标签,保留任何端口号码目前在那里。
请问你怎么能做到这一点?
谢谢,维克多
是否可以创建一个将自己编辑行而不是替换整行的差异补丁文件?
例如,我有以下行:
<foo:ListeningPortBar>3423</foo:ListeningPortBar>
我想将其更改为:
<cat:LoremIpsum>3423</cat:LoremIpsum>
也就是说,我想更改实际端口号周围的文本,但保留端口号 - 我需要将此补丁应用于多个文件,所有文件都具有不同的端口号 - 我只想更改标签,保留任何端口号码目前在那里。
请问你怎么能做到这一点?
谢谢,维克多
补丁替换整行还是仅替换行中的字符并不重要(最终结果是相同的,不是......?),但我不认为这是一个“补丁”问题。有关使用“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”文件实际上与修改后的文件不同。