我正在使用diff
在2个非常大的程序集转储上运行命令。我看到很多这样的输出:
903c903
< ; Emitting BLENDED_CODE for generic X86 CPU
---
> ; Emitting BLENDED_CODE for Pentium 4
995c995
< ; Emitting BLENDED_CODE for generic X86 CPU
---
> ; Emitting BLENDED_CODE for Pentium 4
1123c1123
< ; Emitting BLENDED_CODE for generic X86 CPU
---
> ; Emitting BLENDED_CODE for Pentium 4
1191c1191
< ; Emitting BLENDED_CODE for generic X86 CPU
---
> ; Emitting BLENDED_CODE for Pentium 4
1278c1278
< ; Emitting BLENDED_CODE for generic X86 CPU
---
> ; Emitting BLENDED_CODE for Pentium 4
1347c1347
< ; Emitting BLENDED_CODE for generic X86 CPU
---
> ; Emitting BLENDED_CODE for Pentium 4
1546c1546
< inc dword ptr [ebp-10H]
---
> add dword ptr [ebp-10H], 1
1552c1552
< inc esi
---
> add esi, 1
我真的不想看到包含“Pentium 4”或“通用X86 CPU”的行;具体来说,如果有一行包含“Pentium 4”,我想排除该行及其上方的3行。
是否可以使用grep
执行此操作?我知道grep -v 'Pentium 4'
,但这只适用于单行。我显然不能grep -v -- '---'
,因为有一些有效的差异包含三个破折号。
如果grep查询是在上面的代码上运行的,那么结果应该是
1546c1546
< inc dword ptr [ebp-10H]
---
> add dword ptr [ebp-10H], 1
1552c1552
< inc esi
---
> add esi, 1
答案 0 :(得分:4)
我喜欢这里的流程替换。我们假设 file_a 是:
; Emitting BLENDED_CODE for generic X86 CPU
inc dword ptr [ebp-10H]
file_b 是:
; Emitting BLENDED_CODE for Pentium 4
add dword ptr [ebp-10H], 1
正在运行
diff -I "^;" file_a file_b
将返回:
1,2c1,2
< ; Emitting BLENDED_CODE for generic X86 CPU
< inc dword ptr [ebp-10H]
---
> ; Emitting BLENDED_CODE for Pentium 4
> add dword ptr [ebp-10H], 1
这不是你想要的。但是,当您尝试使用流程替换时,即
diff <(grep -v '^;' file_a) <(grep -v '^;' file_b)
你会得到:
1c1
< inc dword ptr [ebp-10H]
---
> add dword ptr [ebp-10H], 1
答案 1 :(得分:1)
您可以使用-I
的{{1}}选项排除与diff中某个模式匹配的行:
diff
模式必须由两条线匹配,这就是您需要使用diff -I 'Pentium 4\|generic X86 CPU' file1 file2
(逻辑或)运算符使模式与原始模式和更改匹配的原因。
答案 2 :(得分:1)
您可以在bash
中使用流程替换来删除源文件中的注释:
diff <(grep -v '^;' file1.s) <(grep -v '^;' file2.s)
答案 3 :(得分:0)
$ awk '{r=r $0 ORS} (NR%4)==0{if (!/Pentium 4/) printf "%s", r; r=""}' file
1546c1546
< inc dword ptr [ebp-10H]
---
> add dword ptr [ebp-10H], 1
1552c1552
< inc esi
---
> add esi, 1