Назад | Перейти на главную страницу

Sed regexp / d удаление всего файла

Учитывая типичный файл known_hosts:

[123.45.67.89]:22 ssh-rsa bbuivvhbkbjdnflksndkfnksnfk...
[98.76.54.32]:14444 ssh-rsa hohdibsodbfoasbfbsabdfbsd...
[77.34.122.33]:32209 ssh-rsa bksdjncknsdbcksbdcbhdhhb...

Не зная номер строки в файле, но зная IP-адрес.


Следующее удаляет все строки в файле:

sed '/98\.76\.54\.32/d known_hosts > known_hosts'

Я надеюсь, что мне просто не хватает чего-то до абсурда простого.

Тестирование моего регулярного выражения Вот дает мне необходимое совпадение, и мое впечатление таково:

sed '/pattern/d'  file > file

Следует опустить только первую строку, где /шаблон/ это совпадение.


Я знаю, что я не гуру регулярных выражений и не мастер bash, но я серьезно думал, что это не будет битва из нескольких поисков и двух кофе. Кто-нибудь может бросить мне кость?


РЕДАКТИРОВАТЬ: 4 ответа за минуты и все в порядке. Я знал, что это что-то нелепое. Надеюсь, моя глупость обнаружится в чьих-то поисках.

Вместо sed используйте ssh-keygen -R 98.76.54.32

-R имя хоста
Удаляет все ключи, принадлежащие имени хоста, из файла known_hosts. Этот параметр полезен для удаления хешированных хостов (см. Параметр -H выше)

Это > перенаправление вывода, которое очищает файл. Это потому, что выходной файл открывается перед входным файлом. Использовать sed -i сделать редактирование на месте

sed -i '/98\.76\.54\.32/d known_hosts

К сожалению, перенаправление вашего вывода во входной файл работает против вас, поскольку вывод открывается для записи и усекается до того, как оболочка фактически запускается. sed. Вам нужно будет записать во временный файл или использовать -i вариант sed.

Вы должны использовать -i вариант sed (редактировать файлы на месте):

sed -i '/98\.76\.54\.32/d' known_hosts

Если вы выполняете перенаправление вывода, как вы это делали немедленно очистить файл (до того, как его содержимое будет прочитано sed). Если вы хотите использовать перенаправление, вам необходимо использовать временный выходной файл:

sed '/98\.76\.54\.32/d' known_hosts > known_hosts.tmp
mv known_hosts.tmp known_hosts

Сочувствую, регулярное выражение мне не друг. В > перезаписывает файл. sed -i '/TO DELETE/ d' file.txt сделаю это.

Вы можете использовать Vim в режиме Ex:

ex -sc 'g/98\.76\.54\.32/d' -cx known_hosts
  1. g глобальный поиск

  2. d Удалить

  3. x сохранить и закрыть