如何获得差异以仅显示添加和删除的行?如果 diff 不能做到,什么工具可以?

C. *_*oss 85 command-line-interface diff

如何获得差异以仅显示添加和删除的行?如果 diff 不能做到,什么工具可以?

Tom*_*ime 104

试试通讯

另一种看待它的方式:

(警告:如果文件a有以 TAB 开头的行,它(第一个 TAB)将从输出中删除。)

仅排序文件

注意:两个文件都需要排序comm才能正常工作。如果它们尚未排序,您应该对它们进行排序:

sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted
Run Code Online (Sandbox Code Playgroud)

如果文件非常长,这可能是一个很大的负担,因为它需要额外的副本,因此需要两倍的磁盘空间。

  • 只是想补充一点,此解决方案需要对两个文件进行排序(区分大小写)才能产生正确的结果 (5认同)
  • 在足够现代的 shell 上,您可以使用类似 `comm -12 &lt;(sort a) &lt;(sort b)` 之类的东西进行内联排序 (2认同)

mar*_*ton 16

comm可能会做你想做的。从它的手册页:

描述

逐行比较已排序的文件 FILE1 和 FILE2。

在没有选项的情况下,生成三列输出。第一列包含 FILE1 独有的行,第二列包含 FILE2 独有的行,第三列包含两个文件共有的行。

这些列是suppressable用-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
Run Code Online (Sandbox Code Playgroud)

如果您只想要独特的线条而不关心它们在哪个文件中:

[root@dev ~]# comm -3 a b | sed 's/^\t//'
individual
unique
Run Code Online (Sandbox Code Playgroud)

正如手册页所说,必须事先对文件进行排序。


小智 13

要显示没有上下文的添加和删除,行号,+,-,<,> !等等,你可以像这样使用差异:

diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt 
Run Code Online (Sandbox Code Playgroud)

例如,给定两个文件:

一个.txt

Common
Common
A-ONLY
Common
Run Code Online (Sandbox Code Playgroud)

b.txt

Common
B-ONLY
Common
Common
Run Code Online (Sandbox Code Playgroud)

以下命令将显示从 a 中删除或添加到 b 中的行:

diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt 
Run Code Online (Sandbox Code Playgroud)

输出:

B-ONLY
A-ONLY
Run Code Online (Sandbox Code Playgroud)

这个稍微不同的命令将显示从 a.txt 中删除的行:

diff --changed-group-format='%<' --unchanged-group-format='' a.txt b.txt 
Run Code Online (Sandbox Code Playgroud)

输出:

A-ONLY
Run Code Online (Sandbox Code Playgroud)

最后,此命令将显示添加到 a.txt 的行

diff --changed-group-format='%>' --unchanged-group-format='' a.txt b.txt 
Run Code Online (Sandbox Code Playgroud)

输出

B-ONLY
Run Code Online (Sandbox Code Playgroud)


Sco*_*erg 2

这就是 diff 默认情况下所做的...也许您需要添加一些标志来忽略空格?

diff -b -B
Run Code Online (Sandbox Code Playgroud)

应忽略空白行和不同数量的空格。

  • 不,它还显示更改的行(具有一个或四个不同字符的行)。我想要只存在于左侧或右侧的线条。 (4认同)
  • 您可能会争辩说,CHANGED 文件的不同版本仅存在于左侧或右侧。 (2认同)
  • diff(或任何其他工具)无法可靠地判断什么是更改,以及什么是已删除的行被新行替换。 (2认同)