如何在diff对比时忽略指定后缀内容并保留其显示?
如何在diff对比时忽略行内部分内容差异但保留原始内容输出?
可以通过预处理对比+原始内容还原的方式实现,核心思路是先过滤掉不需要关注的!ts:后缀内容进行对比,再把差异行替换回原始文件的内容,同时保留diff -u的输出格式。
具体实现命令
diff -u <(sed 's/\(!ts:\).*/\1/' file1.txt) <(sed 's/\(!ts:\).*/\1/' file2.txt) | awk ' BEGIN { # 提前读取原始文件内容到数组 n1 = 0; while ((getline line < "file1.txt") > 0) orig1[++n1] = line; n2 = 0; while ((getline line < "file2.txt") > 0) orig2[++n2] = line; line1 = 0; line2 = 0; } /^@@ / { # 解析diff输出中的行号范围,跟踪当前行位置 match($0, /@@ -([0-9]+),[0-9]+ \+([0-9]+),[0-9]+ @@/, arr); line1 = arr[1]; line2 = arr[2]; print $0; next; } /^-/ { # 将过滤后的差异行替换为file1的原始行 print "-" orig1[line1++]; next; } /^\+/ { # 将过滤后的差异行替换为file2的原始行 print "+" orig2[line2++]; next; } /^ / { # 无差异的行,同步推进两个文件的行号 line1++; line2++; print $0; next; } # 其余行(比如开头的---、+++标识行)直接输出 1 '
步骤说明
- 预处理对比:用
sed 's/\(!ts:\).*/\1/'把每行!ts:后的内容截断,只保留!ts:本身,然后通过diff -u对比两个预处理后的流,得到基于忽略后缀的差异结果。 - 还原原始内容:用
awk提前加载两个原始文件的所有行,解析diff输出中的行号信息,把输出中标记为差异的-/+行替换回原始文件的对应行,无差异行和标识行直接保留输出。
这种方法既实现了忽略!ts:后缀差异的对比逻辑,又能在最终输出中完整保留原始行的所有内容,完全符合需求。
内容的提问来源于stack exchange,提问作者sh1
相关产品推荐
相关产品推荐

