如何在Unix中以并排方式显示差异行的行号?

52

场景是我有两个文件,希望使用以下命令加上行号并将它们并排进行比较:

diff -y file1.txt file2.txt

sdiff file1.txt file2.txt
上述命令只打印并排的差异,但不显示行号。有什么方法可以做到?我搜索了很多但找不到解决方案。请注意,我不能使用第三方工具。有什么聪明的想法吗?
更新:
我想要文件本身存在的文件号码而不是通过管道进行cat -n等生成的行号。比方说,我正在使用“--suppress-common-l‌​ines”进行差异比较,那么在差异中未显示的行号应该被省略。

3
你试试用 diff -u ... 命令行?它会以标准的差异格式输出差异。 - mic4ael
1
https://unix.stackexchange.com/questions/34874/diff-output-line-numbers - Michael Kohl
@mic4ael:我只想要并排格式的差异。@Michael Kohl:行格式参数仅适用于-u。当与diff -y或sdiff一起使用时,它会产生“冲突”异常。 - nomazoma49
icdiff --line-numbers 怎么样? - Jay Foad
4个回答

39

以下代码可用于将两个文件中不同的字段并排显示。

sdiff -l file1 file2 | cat -n | grep -v -e '($'  

以下代码将在输出中显示常见字段以及行号。

diff -y file1 file2 | cat -n | grep -v -e '($'  

8
@ Utsav: 我希望文件号码是文件本身的编号,而不是由 cat -n 生成的行号。假设我使用 "--suppress-common-lines" 进行 diff,则没有在差异中显示的行号应该被省略。行格式参数仅适用于 -u,如果与 diff -y 或 sdiff 一起使用会产生“冲突”异常。 - nomazoma49
4
diff命令用于比较两个文件的内容并显示它们之间的差异。通过使用--unchanged-line-format,--old-line-format和--new-line-format选项,可以自定义输出格式。以上命令将文件1和文件2进行比较,并按照相应格式输出不同之处。 - gbonetti
我的文件包含换行符和回车符,这破坏了cat -n部分的行为。它会覆盖自身,导致左侧数据跨越到右侧。我通过以下方式解决了这个问题:sdiff -l file1 file2 | tr \\r \ | cat -n | grep -v -e '($ 这将回车符\r替换为空格。 - Brent K.

7
sdiff -s <(cat -n file1.txt) <(cat -n file2.txt)

这将为您提供来自文件的带有行号的并排输出。

3
这并不是最理想的,因为行号是在diff之前应用的,这意味着添加/删除将导致diff认为行号是文件中的更改。例如,使用您的方法,对“ A / B / X / C / D”(其中“ / ”是换行符)进行diff,与“ B / C / X / D”进行diff将显示除X之外的所有行都发生了更改,而理想情况下应该显示X移动和A被删除(其余未更改)。 - R.M.
我需要类似于提问者所问的东西,而这是唯一给了我一个有用选项的答案。当然,它可能需要改进,以便在所有或甚至更多情况下都能正常工作。但我认为即使现在,这个答案已经足够有用和正确,值得成为被接受的答案。如果提问者同意,他/她可以更改接受的答案吗? - anuragw

6
以下命令将显示 file1.txt 的并排输出,行号位于前面,并去除相同的行。
sdiff -l file1.txt file2.txt | cat -n | grep -v -e '($'

0

我曾经遇到过同样的问题,最终在 Fedora 28 下使用了一个图形化工具(diffuse)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接