匹配行并使用sed删除匹配行重复

SSN*_*SSN 0 bash sed

我有配置文件,我希望匹配特定的行,如"server.port = 5480".保留匹配的第一个删除休息匹配行.例

server.port=5480
server.port=5480
server.port=5480
ssl.engine = "enable"
ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"
ssl.cipher-list = "FIPS':' +3DES':'!aNULL"
ssl.engine = "enable"
ssl.use-sslv2 = "disable"
server.port=5480
server.port=5480
server.port=5480
server.port=5480
Run Code Online (Sandbox Code Playgroud)

期望的输出只有一行

server.port=5480
ssl.engine = "enable"
ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"
ssl.cipher-list = "FIPS':' +3DES':'!aNULL"
ssl.engine = "enable"
ssl.use-sslv2 = "disable"
Run Code Online (Sandbox Code Playgroud)

使用sed我想要这个和另外一个这不是序列行可能是变体

fed*_*qui 5

让我们使用awk并打印所有那些不包含server.port或第一次出现的行:

$ awk '!(/server.port/ && c++)' file
server.port=5480
ssl.engine = "enable"
ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"
ssl.cipher-list = "FIPS':' +3DES':'!aNULL"
ssl.engine = "enable"
ssl.use-sslv2 = "disable"
Run Code Online (Sandbox Code Playgroud)

注意我使用这种方法,因为我看到其他行不止一次出现.

这是如何运作的?

awk中的真实条件会触发打印整行.所以,如果你说awk '1' file,将打印所有文件.

我们在这里做的是相反的:在某些情况下限制打印.这些情况server.port发生在第2次,第3次......时间.
由于/server.port/匹配了"server.port"中的行,我们还检查变量c是否为正.

  • 当它被设置为我们第一次!(True && 0++)!(True && False)→交通!(False)→交通True.

  • 在案件的其余部分,它!(True && positive++)!(True && True)→交通!(True)→交通False,所以没有打印被触发.