仅显示 --side-by-side 差异的右侧

仅显示 --side-by-side 差异的右侧

我似乎找不到解决这个问题的方法。有没有一行代码可以只获取输出的右侧diff --side-by-side

例如:

为此:diff --side-by-side file1 file2我得到以下两种类型的结果之一:

  2 Africa                            |   3 Africa
  3 America                               3 America    
  3 Asia                                  3 Asia
  4 Antarctica                            4 Antarctica
  4 Oceania                               4 Oceania
  7 Europe                                7 Europe

或者

  3 Africa                                3 Africa
  3 America                               3 America
  3 Asia                              <
  4 Antarctica                            4 Antarctica
                                      >   4 Asia
  4 Oceania                               4 Oceania
  8 Europe                                8 Europe

我怎样才能把它们变成这样:

| 3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

分别是:

  3 Africa
  3 America
  4 Antarctica
> 4 Asia
  4 Oceania
  8 Europe

请注意,我编辑了原始输出,diff以便它在这个问题中看起来是合理的。它们在终端中显示为对齐(按列),但我不得不在这里对它们进行一些调整,以便它们与终端中显示的完全一致(列整齐对齐),但您可以通过创建以下输入文件来复制输出:

文件1 版本 1

  2 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

文件2 版本1

  3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

文件1 版本 2

  3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  8 Europe

File2 版本 2

  3 Africa
  3 America
  4 Antarctica
  4 Asia
  4 Oceania
  8 Europe

答案1

你似乎想要的根本不是并排比较 - 而是自定义格式以完全排除旧文件或新文件中的行。例如,给定

$ cat file1v1
  2 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe
$ cat file2v1
  3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

然后

$ diff --new-line-format='| %L' --unchanged-line-format='  %L' --old-line-format= file1v1 file2v1
|   3 Africa
    3 America
    3 Asia
    4 Antarctica
    4 Oceania
    7 Europe

虽然给定

$ cat file1v2
  3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  8 Europe

$ cat file2v2
  3 Africa
  3 America
  4 Antarctica
  4 Asia
  4 Oceania
  8 Europe

然后

$ diff --new-line-format='> %L' --unchanged-line-format='  %L' --old-line-format= file1v2 file2v2
    3 Africa
    3 America
    4 Antarctica
>   4 Asia
    4 Oceania
    8 Europe

答案2

这实际上是右列,尽管它最终出现在左侧。此外,这是一个非常丑陋的解决方案,我相信一些更聪明的人会做得更好。但无论如何,这里是:

$ diff --side-by-side file1 file2 | sed -r 's/[^\t]*\t*(.*)/\1/' | sed -r 's/^ *(\||>|<)\t /\1/'

| 3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

解释

  • -r使用 ERE
  • s/old/new/替换old为“新的
  • [^\t]*除了标签之外什么都可以
  • \t*任意数量的标签
  • (.*)行中任意数量的任意字符,(保存)以供稍后使用
  • \1我们保存的图案
  • s/^ *(\||>|<)\t /\1/删除不同行上|><字符周围的内容以修复对齐

相关内容