差异仅显示行内的差异


9

我想比较两个文件中的行,但为了最大程度地减少输出中的噪音,我只希望打印行中的实际差异。

例如,给定以下两个文件:

a.txt

a b c d e f g h i j k l m n o p q r s t u v w x y z

b.txt

a B c d e f g h i j k l m n o p q r s t u v w x y z

(它们之间的区别是字母的情况b

我希望输出是这样的:

[-b-]{+B+}

目前,我发现的最佳方法是使用git diff --word-diff,但它输出的是整行:

a [-b-]{+B+} c d e f g h i j k l m n o p q r s t u v w x y z

除了手动解析输出之外,还有其他更直接的方法吗?同样,理想情况下,我更喜欢使用比更为常用的git diff工具,例如POSIX shell工具,该工具不需要用户安装额外的软件包。


如果您使用其中差异更明显的示例,那就太好了。我不得不着眼睛看这两个字符不一样。
Barmar

抱歉,我添加了一条注释,描述了这两行之间的区别。
酒精

为什么不只是使用bB所以显而易见?我知道这可能是实际的差异,但是出于问题的目的,您可以使其变得更容易。
Barmar

1
我想避免仅适用于ASCII字符的解决方案,但是由于建议的解决方案不依赖于此,因此我对其进行了更改。但是,由于编辑的长度小于6个字符,因此我无法更新答案以反映新的更改。
酒精

Answers:


14

使用wdiff

$ wdiff -3 a.txt b.txt

======================================================================
 [-b-] {+B+}
======================================================================

-3---no-common选项将删除的两个文件之间共同的和只显示不同的话。

===...横幅广告(和空行)可与被移除grep

$ wdiff -3 a.txt b.txt | grep -vx '=*'
 [-b-] {+B+}

wdiffdiff如果提供-d--diff-input选项,也可能读取统一数据,例如git

git diff somefile | wdiff -d -3

尽管wdiff它不是POSIX工具,但通常可用。


可能值得注意的是,如果您的终端支持ANSI转义,则可以在bashrc中使用以下代码使wdiff打印精美的彩色输出(imo)更易于阅读:(alias wdiff="wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m'"此处获取)。
scohe001
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.