在网上搜索后,我发现了另一种更好的Lekensteyn方法。
但是我想使用dif输出作为补丁...,这是有问题的,因为“ grep -v”会保留行号。
因此,我打算改进此命令行:
diff -u -B <(sed 's/^[[:blank:]]*#.*$/ /' file1) <(sed 's/^[[:blank:]]*#.*$/ /' file2)
这不是完美的方法,但是行号保存在补丁文件中。
但是,如果添加了新行而不是注释行,则在修补时,注释将产生Hunk FAILED,如下所示。
File test1:
text
#comment
other text
File test2:
text
new line here
#comment changed
other text changed
现在测试我们的命令
$ echo -e "#!/usr/bin/sed -f\ns/^[[:blank:]]*#.*$/ /" > outcom.sed
$ echo "diff -u -B <(./outcom.sed \$1) <(./outcom.sed \$2)" > mydiff.sh
$ chmod +x mydiff.sh outcom.sed
$ ./mydiff.sh file1 file2 > file.dif
$ cat file.dif
--- /dev/fd/63 2014-08-23 10:05:08.000000000 +0200
+++ /dev/fd/62 2014-08-23 10:05:08.000000000 +0200
@@ -1,2 +1,3 @@
text
+new line
-other text
+other text changed
/ dev / fd / 62和/ dev / fd / 63是通过进程替换生成的文件。“ +换行”和“-其他文本”之间的行是我们sed表达式中定义的用于替换注释的默认空格字符。
现在,当我们应用此补丁时会发生什么:
$ patch -p0 file1 < file.dif
patching file file1
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED -- saving rejects to file file1.rej
解决方案是不使用不带-u的统一差异格式
$ echo "diff -B <(./outcom.sed \$1) <(./outcom.sed \$2)" > mydiff.sh
$ ./mydiff.sh file1 file2 > file.dif
$ cat file.dif
1a2
> new line
3c4
< other text
---
> other text changed
$ patch -p0 file1 < file.dif
patching file file1
$ cat file1
text
new line
#comment
other text changed
现在补丁文件的工作文件(不保证结果非常复杂的差异过程)。
-I
仅当块的所有行都与regexp匹配时,该选项才会使其忽略。因此,您可以通过这种方式忽略仅注释更改,但不能忽略接近非注释更改的注释更改。