如何让 diff 只显示添加和删除的行?如果 diff 不能做到这一点,什么工具可以?
答案1
尝试沟通
另一种看待它的方式:
显示仅存在于文件 a 中的行:(即从 a 中删除的内容)
comm -23 a b
显示仅存在于文件 b 中的行:(即添加到 b 的内容)
comm -13 a b
显示仅存在于一个文件或另一个文件中的行:(但不是同时存在于两个文件中)
comm -3 a b | sed 's/^\t//'
(警告:如果文件a
包含以 TAB 开头的行,则它(第一个 TAB)将从输出中删除。)
仅限已排序的文件
笔记:两个文件都需要排序comm
才能正常工作。如果它们尚未排序,您应该对它们进行排序:
sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted
如果文件非常长,这可能是一个很大的负担,因为它需要额外的副本,因此需要两倍的磁盘空间。
或者如果你使用现代 shell:
comm -12 <(sort a) <(sort b)
答案2
要显示没有上下文、行号、+、-、<、>!等的添加和删除,你可以像这样使用 diff:
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
例如,给定两个文件:
文本文件
Common
Common
A-ONLY
Common
文本文件
Common
B-ONLY
Common
Common
以下命令将显示从 a 中删除或添加到 b 的行:
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
输出:
B-ONLY
A-ONLY
这个略有不同的命令将显示从 a.txt 中删除的行:
diff --changed-group-format='%<' --unchanged-group-format='' a.txt b.txt
输出:
A-ONLY
最后,此命令将显示添加到 a.txt 的行
diff --changed-group-format='%>' --unchanged-group-format='' a.txt b.txt
输出
B-ONLY
答案3
comm
可能会做你想做的事。从它的手册页中:
描述
逐行比较已排序的文件 FILE1 和 FILE2。
不使用任何选项,则生成三列输出。第一列包含 FILE1 独有的行,第二列包含 FILE2 独有的行,第三列包含两个文件共有的行。
这些列可分别用-1
、-2
和抑制-3
。
例子:
[root@dev ~]# cat a
common
shared
unique
[root@dev ~]# cat b
common
individual
shared
[root@dev ~]# comm -3 a b
individual
unique
如果您只想要唯一的行而不关心它们位于哪个文件中:
[root@dev ~]# comm -3 a b | sed 's/^\t//'
individual
unique
正如手册页所述,必须事先对文件进行排序。
答案4
不,diff
它实际上并不像人们想象的那样显示两个文件之间的差异。它为类似工具生成一系列编辑命令,patch
用于将一个文件更改为另一个文件。
尝试执行您所寻找的操作时遇到的困难是如何定义已更改的行以及已删除的行和已添加的行。此外,当相邻的行被添加、删除和更改时该怎么办。