使用Sed:删除所有包含某个模式的行,除了以特定模式2开头的行。

3
我需要一位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个回答

3
如果一行不以 127.0.0.1 开头,但包含 foo.bar,则删除该行。
sed '/^127\.0\.0\.1/!{/foo\.bar/d}' /etc/hosts

使用 ,您无需转义正则表达式中的特殊字符,这在我看来要好得多。

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

使用-E标志,无需转义正则表达式中的特殊字符:sed -E '/^127.0.0.1/!{/foo.bar/d}' /etc/hosts - alphaGeek
@alphaGeek 不,它将匹配127000001和foozbar。 - oguz ismail
-E 是 GNU 扩展,即不可移植。 - oguz ismail

0
如果一行被复制了,你可以使用这个简单的技巧获取唯一的行:
 ... | sort | uniq

更好的方法是 sort -u - Alex Harvey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接