我似乎找不到解决这个问题的方法。有没有一行代码可以只获取输出的右侧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
使用 EREs/old/new/
替换old
为“新的[^\t]*
除了标签之外什么都可以\t*
任意数量的标签(.*)
行中任意数量的任意字符,(保存)以供稍后使用\1
我们保存的图案s/^ *(\||>|<)\t /\1/
删除不同行上|
或>
或<
字符周围的内容以修复对齐