是否可以创建一个差异补丁文件来编辑行本身,而不是替换整行?
例如,我有以下一行:
<foo:ListeningPortBar>3423</foo:ListeningPortBar>
我希望将其更改为:
<cat:LoremIpsum>3423</cat:LoremIpsum>
也就是说,我想更改实际端口号周围的文本,但保留端口号 - 我需要在多个文件中应用此补丁,所有文件都有不同的端口号 - 我只是想更改标签,保留当前的任何端口号。
你怎么能实现这个目标呢?
谢谢, 维克多
答案 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”文件实际上与修改后的文件不同。