如何在人类语言文本(中文)上进行逐字差异?
我在git存储库中有一些中文的纯文本。文本已编辑,我想看看添加/删除了哪些单词。文件中的一行代表了一整段文本,所以简单的gitdiff是不够的:我们知道某个段落中的某些内容发生了变化,但我们看不到其中的哪些句子/单词发生了变化。
更糟糕的是,正如我所说,文本是中文的。与英语和其他印欧语言不同,汉语不使用空格作为单词分隔符。整段文字加上中文标点符号,形成了一个统一的方框,没有任何空格。因此,gitdiff——word diff根本没有帮助。
有没有办法在这样一篇中文文本的两个版本之间进行人类可读的区分?每个字符都有一个等价的--word diff吗?
我发布这篇文章是为了回答我自己的问题,但它只包含解决方案的一部分,一个指向正确方向的指针。有些东西仍然不见了。
发件人如何在统一的diff文件中可视化每个字符的差异?尝试任一命令:
git diff --word-diff-regex=.
git diff --color-words=.
上面两个命令中的任何一个都让我非常接近。然而,我有两个问题。如果我只是简单地键入上面的命令并查看控制台中的输出,我只会看到每一段的开头。整行不适合控制台,git截断了末尾(即大部分!)。
或者如果我试图重定向到一个文件:
git diff --color-words=. > diff.patch
然后使用vim查看文件,我得到了一些混乱的东西,看起来更像二进制代码,而不是任何人类可读的东西。
更新:
我最终使用了这个解决方案:
wget https://git.kernel.org/cgit/git/git.git/plain/contrib/diff-highlight/diff-highlight --no-check-certificate
chmod u+x diff-highlight
git diff --color=always | ./diff-highlight | less -R
icdiff可以满足您的需求。当比较中文文本时,该工具可以逐字显示差异。
逐字逐句的diff
应该作为您自己的答案。从文档来看,--word-diff-regex
和--color-words
之间的关系如下。
--color-words[=<regex>
Equivalent to --word-diff=color plus (if a regex was specified) --word-diff-regex=<regex>.
实际上,您可以将word-diff
模式设置为porcelain
,以便在控制台中更好地查看diff
输出。
git diff --word-diff-regex=. --word-diff=porcelain
要将输出重定向到文件,您不应该使用--color-words
(默认--word-diff
为color
),因为生成的文本文件无法将git diff
以某种方式编码的颜色信息识别为您得到的混乱。您只需使用--word-diff-regex=.
,默认的--word-diff
模式为plain
。
git diff --word-diff-regex=. > diff.patch