Patchfiles - 编辑线,而不是替换?

时间:2012-05-30 06:06:17

标签: patch

是否可以创建一个差异补丁文件来编辑行本身,而不是替换整行?

例如,我有以下一行:

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

我希望将其更改为:

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

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

你怎么能实现这个目标呢?

谢谢, 维克多

1 个答案:

答案 0 :(得分: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,using 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”文件实际上与修改后的文件不同。