0

是否可以创建一个将自己编辑行而不是替换整行的差异补丁文件?

例如,我有以下行:

 <foo:ListeningPortBar>3423</foo:ListeningPortBar>

我想将其更改为:

 <cat:LoremIpsum>3423</cat:LoremIpsum>

也就是说,我想更改实际端口号周围的文本,但保留端口号 - 我需要将此补丁应用于多个文件,所有文件都具有不同的端口号 - 我只想更改标签,保留任何端口号码目前在那里。

请问你怎么能做到这一点?

谢谢,维克多

4

1 回答 1

0

补丁替换整行还是仅替换行中的字符并不重要(最终结果是相同的,不是......?),但我不认为这是一个“补丁”问题。有关使用“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”文件实际上与修改后的文件不同。

于 2012-07-08T10:30:58.600 回答