获取 diff 输出中正确的行数

获取 diff 输出中正确的行数

我想在 diff 的输出中获得正确的行数(特别是使用-y--suppress-common-lines选项)。使用一个简单的wc -l方法不是工作,因为如果两个文件结束时没有换行符并且它们的最后一行不同,wc -l则不会计算最后一行。

有没有简单有效的解决方案来避免这种情况?

例如,如果您有文件“a”:

a
b
c
d   #no newline here

和“b”:

a
b
c
D    #no newline here

输出是:

$ diff -y --suppress-common-lines a b | wc -l
0

这显然是不正确的,因为diff 输出一行。

答案1

没有换行符,所以wc -l是正确的。相反,您想要计算行的开头数。一种方法是:

$ diff -y --suppress-common-lines a b | grep '^' | wc -l
1

答案2

这并没有错。一行必须以 LF 字符终止,否则,它不是一行(并且无论如何都wc -l记录为计算换行符,而不是行)。

您可以将输出通过管道传输到添加回丢失的 LF 字符的内容中。 GNU 粘贴可以做到这一点:

$ diff -y --suppress-common-lines <(printf a) <(printf b) | wc -l
0
$ diff -y --suppress-common-lines <(printf a) <(printf b) | paste | wc -l
1

它可能不适用于粘贴的其他实现,但由于您使用的是 GNU 特定选项diff,我们可以安全地假设您paste也有 GNU。 POSIX 未指定非终止行的文本实用程序的行为。

答案3

正如手册和信息页中所述,-l( --lines) 选项似乎用于wc打印换行符的数量。因此,如果一行不以换行符结尾,则不会增加计数。

相关内容