如何逐行进行“差异”输出?

如何逐行进行“差异”输出?

我有一个看似简单的问题,但我找不到答案。

假设我有两个文件:

A
B
C
D

A
X
Y
D

当我运行diff -U 1000这些时,我得到:

 A
-B
-C
+X
+Y
 D

相反,我想要得到:

 A
-B
+X
-C
+Y
 D

总体上可以理解我想要实现的目标:我有一个smartctl在硬盘上运行的预定脚本,保存历史数据并进行比较。因此,更改的行实际上是对早期文件中相应行的单独替换:

-  3 Spin_Up_Time      0x0027   173   168   021    Pre-fail  Always    -    2350
-  4 Start_Stop_Count  0x0032   096   096   000    Old_age   Always    -    4445
+  3 Spin_Up_Time      0x0027   172   168   021    Pre-fail  Always    -    2358
+  4 Start_Stop_Count  0x0032   096   096   000    Old_age   Always    -    4461

答案1

我最终得到了一个两步过程:传递给git diff然后使用 AWK 脚本对其进行后处理:

     git diff --word-diff=porcelain -U10000 %1 %2  |
     awk -f mysmartdiff.awk;

第一步返回以下形式的结果:

~
   3 Spin_Up_Time            0x0027
-172
+173
    168   021    Pre-fail  Always       -
-2358
+2333

第二个脚本执行以下操作:

最终结果截图

脚本mysmartdiff.awk如下:

BEGIN {
    DEBUG=0
    l1=""
    l2=""
    old=""
    new=""
}
function dprint(s) { if(DEBUG) {print s > "/dev/stderr"} }

function appendDiff() {
    if(length(old)!=0 || length(new)!=0) {
        l1 = l1"\033[1;31m"old"\033[0m"
        l2 = l2"\033[1;32m"new"\033[0m"
        old="";new="";
    }
}
{
    dprint(">>>>>>>>>>>>>>")
    dprint("ORIG: " $0)
    if(match($0, /^ /)) {
        appendDiff();
        l1 = l1""substr($0,2)
        l2 = l2""gensub(/[^-]/, " ", "g", substr($0,2)); ## leave '-' to aid further space trimming
    } else if(match($0, /^~/)) {
        appendDiff();
        print l1;
        if(l2 !~ /^[ -]+$/) {
            print l2;
        }
        l1=""
        l2=""
    } else if(match($0, /^-/)) {
        old=substr($0,2);
    } else if(match($0, /^+/)) {
        new=substr($0,2);
    }
}

相关内容