删除 bash 中的重复多行模式

删除 bash 中的重复多行模式

我有这个文本文件,我想删除其中的多行重复项。

在这种情况下,该interface e0/0块在文件中重复,并且我只希望文件中出现这些行的一个实例。

Linux 或 bash 中是否有一个实用程序可以帮我做到这一点?

示例文本文件

interface e0/0
 description "R1"
 ip address 10.1.1.1 255.255.255.0
 no shutdown
!
interface e0/1
 description "R2"
 ip address 10.1.2.1 255.255.255.0
 no shutdown
!
interface e0/0
 description "R1"
 ip address 10.1.1.1 255.255.255.0
 no shutdown
!
interface e0/2
 description "R3"
 ip address 10.1.3.1 255.255.255.0
 no shutdown

处理后

interface e0/0
 description "R1"
 ip address 10.1.1.1 255.255.255.0
 no shutdown
!
interface e0/1
 description "R2"
 ip address 10.1.2.1 255.255.255.0
 no shutdown
!
interface e0/2
 description "R3"
 ip address 10.1.3.1 255.255.255.0
 no shutdown

答案1

sed '
1 i \
!
s/^!/\x00!/' | sort -uz | tr -d "\0" | tail -n +2

要使用文件,请使用重定向,例如{ sed … ; } <input.txt >output.txt,其中sed …表示整个命令。

该解决方案基于我的另一个答案. 它的工作原理如下:

  1. sed打印!在第一行之前,因此!我们拥有的不是分隔符,而是!起始符。换句话说,每个块!前面都有自己的分隔符。

  2. sed!在来自输入(不是来自sed)且位于行首的每个字符前插入一个空字符。这样,空字符便可将配置文件分隔开。

  3. sort -z使用这些空字符作为分隔符,因此它会对整个配置文件进行排序,而不是对单独的行进行排序。排序是一种副作用;我们需要它,因此相同的配置文件最终会彼此相邻并将-u它们减少为一个实例。

  4. tr删除空字符。

  5. tail删除第一行,这是!肯定的。这样!又是分隔符。

笔记:

  • 此答案中的“相同”确实意味着相同。不同的缩进、不同的行顺序或尾随空格足以使一个块与另一个块不同。

相关内容