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
確實輸出了一行。
沒有換行符,所以
wc -l
是正確的。相反,您想計算行首的數量。一種方法:$ diff -y --suppress-common-lines a b | grep '^' | wc -l 1
這不是不正確的。一行必須由一個 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
它可能不適用於 paste 的其他實現,但由於您使用的是 GNU 特定選項
diff
,我們可能可以安全地假設您也有 GNUpaste
。POSIX 未指定非終止行的文本實用程序的行為。