我从diff
几个文件中得到了输入。这些文件包含 4 行长的信息块,由空行分隔,有时 1-3 行可能不同。
我diff
使用参数调用是-c3
因为我需要围绕不同行的上下文来获取完整的信息块,因为行本身毫无价值。
因此,我的输出变得非常混乱,难以阅读。因此,我正在寻找一种方法来删除不属于不同块的上下文行。
输入文件示例:
Port-configuration of Switch "HP_e5412zl_secondary"
Timestamp: 20140206-161001
Interface: A1
Description: Uplink to primary switch
VLAN Untagged: 2
VLANs Tagged: 1 23 42 103 169
Interface: A2
Description: -- Not set --
VLAN Untagged: 30
VLANs Tagged:
Interface: A3
Description: WS-198
VLAN Untagged: 1
VLANs Tagged:
Interface: A4
Description: -- Not set --
VLAN Untagged: 30
VLANs Tagged:
Interface: A5
Description: Printer finances
VLAN Untagged: 30
VLANs Tagged:
为了拒绝我的场景,请使用它并更改一些随机行。
当我diff -c3
在两个不同的文件上运行时,我得到如下信息:
*** 2014-02-06/HP_e5412zl_secondary.txt 2014-02-06 16:14:38.024112434 +0100
--- 2014-02-05/HP_e5412zl_secondary.txt 2014-02-05 16:14:27.415741855 +0100
***************
*** 246,255 ****
VLAN Untagged: 1
VLANs Tagged:
Interface: A4
Description: -- Not set --
VLAN Untagged: 30
VLANs Tagged:
Interface: A5
Description: Printer finances
--- 245,254 ----
VLAN Untagged: 1
VLANs Tagged:
Interface: A4
Description: WS-211
VLAN Untagged: 1
VLANs Tagged:
Interface: A5
Description: Printer finances
***************
...
我已经尝试了我最好的 sed 技巧,但未能将我需要的信息与上下文混乱隔离开来。所需的输出如下所示:
*** 2014-02-06/HP_e5412zl_secondary.txt 2014-02-06 16:14:38.024112434 +0100
--- 2014-02-05/HP_e5412zl_secondary.txt 2014-02-05 16:14:27.415741855 +0100
***************
*** 246,255 ****
Interface: A4
Description: -- Not set --
VLAN Untagged: 30
VLANs Tagged:
--- 245,254 ----
Interface: A4
Description: WS-211
VLAN Untagged: 1
VLANs Tagged:
***************
...
-> 虽然我什至不需要包含行号的行。一个简单的分隔符就足够了。
我试过这个:
diff -c3 file1 file2 | sed -n '/^[ ]*Inter.*/,/^[ ]*VLANs.*/p'
和这个:
diff -c3 file1 file2 | sed -e '/^[*-]{3,}.*/,/^$/d'
此外,我通过掩盖它们或仅使用其中一个来尝试使用*
and字符。使用带和不带括号的蒙版和未蒙版 - 没有任何效果。-
\*
帮助?请?
Bonusquestion: 我想用 colordiff 而不是 diff 来做到这一点。这会增加难度(因为嵌入的颜色代码或任何东西)?