如何使用 shell 脚本在 Linux 中使用“diff”命令获取字符级别差异?

如何使用 shell 脚本在 Linux 中使用“diff”命令获取字符级别差异?

我有两个 SQL 文件,一个old.sqlnew.sql.

假设old.sql包含一个包含三个字段的表,Emp_Id、Name 和 Address,数据存储在 old.sql 中,如下所示:

Insert into table1 values (101 ,"a", "xyz");
Insert into table1 values (102 ,"b", "pqr");

然后我将“a”地址“xyz”更改为“xyz123”并将该数据保存在文件中new.sql。现在该new.sql文件包含如下数据:

Insert into table1 values (101 ,"a", "xyz123");
Insert into table1 values (102 ,"b", "pqr");

当我使用diff这样的命令时:

diff old.sql new.sql

它给出了逐行差异,但我只想要更新的数据,例如 xyz123。

答案1

来自的简短回答这里:

git diff --word-diff=color --word-diff-regex=. file1 file2

这里:

diff -u file1 file2 |perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight

答案2

你可能会发现wdiff对于这种类型的比较很有用;它是一个diff产生逐字比较的前端。根据您的示例,它默认生成

Insert into table1 values (101 ,"a", [-"xyz");-] {+"xyz123");+}
Insert into table1 values (102 ,"b", "pqr");

它可以使用终端功能使终端上的输出更清晰 ( wdiff -t)。它还有一个-3选项,将输出限制为仅更改的单词:

======================================================================
 [-"xyz");-] {+"xyz123");+}
======================================================================

如果您尚未安装 wdiff,则需要安装它。运行sudo apt-get install wdiffsudo dnf install wdiffsudo yum install wdiff或 适合您的操作系统的命令。

答案3

您可以使用:

diff -u old.sql new.sql |colordiff |diff-highlight

截屏

colordiff 是一个 Ubuntu 软件包。您可以使用安装它sudo apt-get install colordiff

diff-hight来自 git (自版本 2.9 起)。它位于/usr/share/doc/git/contrib/diff-highlight/diff-highlight。你可以把它放在你的某个地方$PATH。或者从diff-so-fancy 项目

答案4

我也写了我的自己的脚本使用以下方法解决这个问题最长公共子序列算法。

它是这样执行的

JLDiff.py a.txt b.txt out.html

结果是带有红色和绿色的 html。较大的文件确实需要更长的时间来处理,但这会进行真正的逐字符比较,而无需首先逐行检查。

此答案交叉发布自这里

我发现 JLDiff 在 pypy 下运行速度要快得多。

相关内容