Sed: удалить все строки с шаблоном, кроме тех, которые начинаются с patter2 - PullRequest
3 голосов
/ 07 мая 2019

Мне нужна помощь седовского гуру.Мне нужно изменить содержимое /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

Любой сед Гуру готов помочь?

Ответы [ 2 ]

3 голосов
/ 07 мая 2019

Если строка не начинается с 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
0 голосов
/ 07 мая 2019

Если строка удвоена, вы можете получить уникальные, используя этот простой трюк:

 ... | sort | uniq
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...