Sed:删除所有带有pattern的行,但以patter2开头的行除外

时间:2019-05-07 09:04:04

标签: bash macos sed

我需要一位sed大师的帮助。 我需要修改/etc/hosts的内容,以便删除所有包含foo.bar的行,但以127.0.0.1开头的行除外。

我尝试使用sed -i '' "/127.0.0.1/p;/foo.bar/d",但是每次运行都会使127.0.0.1 localhost行的数量增加一倍。

提供文件:

127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost

127.0.0.1 console-dev.foo.bar

192.168.64.22 apiserver.foo.bar console.foo.bar

预期文件:

127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost

127.0.0.1 console-dev.foo.bar

当前输出:

127.0.0.1       localhost
127.0.0.1       localhost
127.0.0.1       localhost
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost

127.0.0.1 console-dev.foo.bar

任何愿意帮助的sed大师吗?

2 个答案:

答案 0 :(得分:3)

如果一行不是以127.0.0.1开头,而是包含foo.bar,请 d 删除它。

sed '/^127\.0\.0\.1/!{/foo\.bar/d}' /etc/hosts

使用,您无需转义正则表达式有效的字符,这是更好的IMO。

awk '$1=="127.0.0.1"||!index($0,"foo.bar")' /etc/hosts

答案 1 :(得分:0)

如果一行加倍,则可以使用以下简单技巧获得唯一的一行:

 ... | sort | uniq