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

use*_*519 8 diff shell-script

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

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

Insert into table1 values (101 ,"a", "xyz");
Insert into table1 values (102 ,"b", "pqr");
Run Code Online (Sandbox Code Playgroud)

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

Insert into table1 values (101 ,"a", "xyz123");
Insert into table1 values (102 ,"b", "pqr");
Run Code Online (Sandbox Code Playgroud)

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

diff old.sql new.sql
Run Code Online (Sandbox Code Playgroud)

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

Cee*_*man 16

来自这里的简短回答:

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

这里

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

  • 上面 git 示例的一个小技巧:添加 `--no-index`,您也可以比较未跟踪的文件。 (2认同)

Ste*_*itt 9

您可能会发现wdiff这种比较很有用;它是diff产生逐字比较的前端。使用您的示例,它默认生成

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

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

======================================================================
 [-"xyz");-] {+"xyz123");+}
======================================================================
Run Code Online (Sandbox Code Playgroud)

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


小智 5

您可以使用:

diff -u old.sql new.sql |colordiff |diff-highlight
Run Code Online (Sandbox Code Playgroud)

截屏

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 project获取它。


小智 2

根据定义,diff 逐行显示差异(请参阅 diff 手册页),因此它不会仅显示不同的字符。您可以通过预处理文件来减少差异量,例如在每个半列后插入行尾字符:

sed -e 's/;/;\'$'\n/g' old.sql > old.patched
Run Code Online (Sandbox Code Playgroud)

然后对两个结果文件使用 diff。