我有这个文本文件,我想删除其中的多行重复项。
在这种情况下,该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 …
表示整个命令。
该解决方案基于我的另一个答案. 它的工作原理如下:
sed
打印!
在第一行之前,因此!
我们拥有的不是分隔符,而是!
起始符。换句话说,每个块!
前面都有自己的分隔符。sed
!
在来自输入(不是来自sed
)且位于行首的每个字符前插入一个空字符。这样,空字符便可将配置文件分隔开。sort -z
使用这些空字符作为分隔符,因此它会对整个配置文件进行排序,而不是对单独的行进行排序。排序是一种副作用;我们需要它,因此相同的配置文件最终会彼此相邻并将-u
它们减少为一个实例。tr
删除空字符。tail
删除第一行,这是!
肯定的。这样!
又是分隔符。
笔记:
- 此答案中的“相同”确实意味着相同。不同的缩进、不同的行顺序或尾随空格足以使一个块与另一个块不同。