1

我从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 来做到这一点。这会增加难度(因为嵌入的颜色代码或任何东西)?

4

1 回答 1

2

如果 awk 是可以接受的,你可以使用这个:

awk '/^[^! ]/ {p = 1; print;}  /^ *$/ {if (p++ % 2 == 0) print;}  (p % 2 == 0) { print; }'

解释:

  • 在任何差异元输出上,设置p=1并打印该行
  • 在任何空白行上,将 1 添加到p. p如果是偶数则打印该行。
  • 否则,如果p是偶数则打印该行。

这会产生您提供的所需输出。请注意,这不适合反馈到 diff 中(因为行号需要更改),并且仍然包含所有 diff 元数据,因为您说过您想要它。

请注意,我的差异将 a!作为更改行的第一个字符,因此我还将其作为非元输出查找。

这可能适用于着色差异,如果你能找到一种方法让它认为你的管道可以显示颜色转义。

于 2014-02-06T19:21:07.653 回答