【问题标题】:How to display line numbers in side by side diff in unix?如何在unix中并排显示行号?
【发布时间】:2016-08-15 07:17:34
【问题描述】:

场景是我有 2 个文件,我想使用以下命令并排比较它们的行号:

diff -y file1.txt file2.txt

sdiff file1.txt file2.txt

上面的命令只是打印并排差异,但不显示行号。有什么办法吗?我搜索了很多,但找不到任何解决方案。我不能使用第三方工具仅供参考。 任何人的天才想法?

更新:

我想要文件本身的文件编号,而不是通过管道生成的行号 cat -n 等。可以说,我正在使用“--suppress-common-l‌​ines”进行差异化那么应该省略差异中未显示的行号。

【问题讨论】:

标签: file unix diff sdiff


【解决方案1】:

下面的代码可以用来并排显示两个文件中不常见的字段。

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

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

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

【讨论】:

  • @Utsav:我想要文件本身的文件号,而不是 cat -n 生成的行号。可以说,我正在使用“--suppress-common-lines”进行差异,那么应该省略差异中未显示的行号。行格式参数仅适用于 -u。与 diff -y 或 sdiff 一起使用时会出现“冲突”异常。
  • diff --unchanged-line-format="" --old-line-format=":%dn: %L" --new-line-format=":%dn: %L " 文件1 文件2
  • 我的文件有换行符和回车符,这破坏了cat -n 部分的行为。它正在覆盖自身,因此左侧数据跨越到右侧。我解决了这个问题:sdiff -l file1 file2 | tr \\r \ | cat -n | grep -v -e '($ 这用空格替换了回车符 \r。
【解决方案2】:

以下命令将显示并排输出,前面带有 file1.txt 的行号并删除了相同的行。

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

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,最终在 fedora 28 下使用了图形工具(漫反射)

    【讨论】:

      【解决方案4】:
      sdiff -s <(cat -n file1.txt) <(cat -n file2.txt)
      

      这为您提供了与 source 文件中的行号并排的输出。

      【讨论】:

      • 这不太理想,因为行号是在 diff 之前应用的,这意味着添加/删除会导致 diff 认为行号是文件。例如。使用您的方法,带有“A/B/X/C/D”(其中“/”是换行符)与“B/C/X/D”不同的文件将显示除 X 更改之外的所有行,而理想情况下它应该显示 X 移动和 A 被删除(其余不变)。
      • 我需要类似于 OP 所要求的东西,这是唯一给我一个有用选择的答案。当然,它可能需要改进,以便差异适用于所有甚至更多情况。但我认为即使现在这个答案足够有用且正确,值得被接受。如果 OP 同意,他/她可以更改接受的答案吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 2021-04-18
      相关资源
      最近更新 更多