首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从diff输出中删除不需要的上下文行(使用sed)

从diff输出中删除不需要的上下文行(使用sed)
EN

Stack Overflow用户
提问于 2014-02-06 17:15:53
回答 1查看 619关注 0票数 1

我从diff获得了几个文件的输入。这些文件包含4行长的信息块,由空行分隔,有时1-3行可能不同。

我使用参数diff调用-c3,因为我需要围绕不同行的上下文来获得完整的信息块,因为该行本身毫无价值。

正因为如此,我的输出变得杂乱无章,很难读懂。因此,我正在寻找一种方法来删除不属于不同块的上下文行。

输入文件的示例:

代码语言:javascript
复制
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时,会得到如下所示:

代码语言:javascript
复制
*** 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
***************
...

我试过了我最好的技巧,但未能将我需要的信息从上下文的杂乱中分离出来。所需的输出如下所示:

代码语言:javascript
复制
*** 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:   

***************
...

->,虽然我甚至不需要包含行号的行。一个简单的分离器就足够了。

我试过这个:

代码语言:javascript
复制
diff -c3 file1 file2 | sed -n '/^[ ]*Inter.*/,/^[ ]*VLANs.*/p'

这是:

代码语言:javascript
复制
diff -c3 file1 file2 | sed -e '/^[*-]{3,}.*/,/^$/d'

此外,我还通过屏蔽*-字符( \* )或仅使用其中的一个字符对它们进行了实验。用它们蒙面,戴上蒙面,带着和不带括号的东西--没有用。

帮助?请?

Bonusquestion:,我想用彩色代替diff来做这个。这会增加难度(因为嵌入的颜色代码或其他什么的)吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-06 19:21:07

如果awk是可以接受的,您可以使用以下内容:

代码语言:javascript
复制
awk '/^[^! ]/ {p = 1; print;}  /^ *$/ {if (p++ % 2 == 0) print;}  (p % 2 == 0) { print; }'

解释:

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

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

请注意,我的diff将!作为更改行的第一个字符,因此我也将其作为非元输出。

这可能适用于彩色差异,如果你能找到一种方法来欺骗它,认为你的烟斗可以显示颜色逃逸。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21609603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档