我有一个看似简单的问题,但我找不到答案。
假设我有两个文件:
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);
}
}