diff:根据缩进显示整个部分

diff: show entire section based on indentation

我正在使用 GNU diff 实用程序来识别配置文件的更改(目前我们只查看 Cisco ASA 和 IOS 设备)。我需要能够根据缩进级别识别对配置组的更改。

例如,采取这样的配置:

object-group network DM_INLINE_NETWORK_3
 network-object object Hyrule-DC02
 network-object object Hyrule-DC03

如果第三行 "network-object object Hyrule-DC02" 被删除,那么我想打印整组配置,从没有缩进的第一行开始,直到最后一行有缩进。在此示例中,我要打印的行是:

object-group network DM_INLINE_NETWORK_3
 network-object object Hyrule-DC03

这里是代码结构的例子。这种按缩进分组的样式在整个配置中使用:

object-group network DM_INLINE_NETWORK_2
 network-object object Hyrule-NS01-MGMT
 network-object object Hyrule-NS01-VIP1
object-group network DM_INLINE_NETWORK_3
 network-object object Hyrule-DC02
 network-object object Hyrule-DC03

如有任何帮助,我们将不胜感激!如果此 example/question 不够清楚,请告诉我。

让我为您描绘一个基于通用 Unix 工具的解决方案。

  • 首先用sed处理文件,将两个文件的缩进行折叠成一行。用控制字符替换前导空格。为此,您将使用 sed{Hsp 命令。
  • 然后运行 diff在两个折叠的文件上,指定处理一个二进制文件就可以了。
  • 最后,运行 seddiff 的输出上通过用 [= 替换控制字符来展开输出19=]diff 的前导字符(例如 <>)、换行符和缩进。这里 seds 命令应该就是您所需要的。