在差异输出中获取正确的行数


8

我想在diff的输出中获得正确的行数(特别是-yand --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 输出一行。

Answers:


13

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

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

3

没错 行必须以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,因此我们可以放心地假设您也具有GNU paste。POSIX未指定未终止行的文本实用程序的行为。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.