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

时间:2016-08-25 12:53:42

标签: 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

所需的输出只有一行

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"

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

1 个答案:

答案 0 :(得分: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"

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

这是如何工作的?

awk中的真实条件会触发打印整行。因此,如果您说awk '1' file,则将打印所有文件。

我们在这里所做的恰恰相反:在某些情况下限制打印。这些情况是在第2次,第3次...... server.port时发生的 由于/server.port/匹配其中包含“server.port”的行,因此我们还会检查变量c是否为正。

  • 首次设置时!(True && 0++) !(True && False)!(False)True

  • 在其他情况下,!(True && positive++)!(True && True)!(True)False,因此不会触发任何打印。

    < / LI>