Bash - найти ключевое слово в файле и удалить его строку

119
8

Я хотел бы дать ключевое слово, найти строку, где это ключевое слово aṕpears в файле и удалить всю строку.


Это то, что я получил, но он не работает так, как должен:


KEYWORD='domain.com'
cat /etc/hosts | grep -v "$KEYWORD" > /etc/hosts

UPDATE


Это то, что сработало для меня:


sed -i_bak -e '/domain\.com/d' /etc/hosts


Однако, поскольку у меня было две строки с "domain.com", есть ли способ сказать sed удалить только строку, где отображается точное ключевое слово "domain.com"


Это исходное содержимое /etc/hosts:


127.0.0.1       localhost       localhost.localdomain
222.111.22.222 hvn.domain.com
222.111.22.222 domain.com

Вот как это сделать после команды sed -i_bak -e '/domain\.com/d' /etc/hosts:


127.0.0.1       localhost       localhost.localdomain

Я попробовал sed -i_bak -e '/\<namourphoto\.com\.br\>/d' ~/Desktop/hosts, но это не сработало.


Заключение


Это код, который я придумал (на основе помощи, которую дали мне хорошие люди):


D=domain.com
DOMAIN=`echo "$D" | sed 's/\./\\\\./g'`
sed -i_bak -e "/[\t]$DOMAIN/d" /etc/hosts

Обратите внимание, что:


    Я считаю, что всегда есть вкладка перед удаляемым доменом


    Я автоматически удаляю точки имени домена.


спросил(а) 2011-08-13T16:34:00+04:00 9 лет, 1 месяц назад
1
Решение
148

Используйте редактор потока, sed:


sed -i ".bak" '/culpa/d' test.txt

Вышеупомянутое удалит строки, содержащие culpa в test.txt. Он создаст резервную копию оригинала (с именем test.txt.bak) и изменит исходный файл на месте.

ответил(а) 2011-08-13T16:42:00+04:00 9 лет, 1 месяц назад
99

Перенесите его в другой файл, а не тот, который вы читаете, и будьте осторожны с бесполезным использованием cat.


grep -v "$KEYWORD" /etc/hosts > newfile

Помимо тонкого ответа на sed, вы также можете использовать Perl и немного улучшенное регулярное выражение, чтобы решить эту проблему:


perl -pi.old -e 's/.*\sdomain\.com\s*\n//' file

Примечание. Я рассматриваю domain.com будет изолирован символами пробела (вкладки или пробелы и т.д.) и что после него будет отображаться только ноль или больше пробелов до новой строки. Аналогично -i в sed,
-i.old в perl устанавливает переменную $^I, и ваш исходный файл получит изменения, в то время как копия будет сохранена под старым именем и .old.

ответил(а) 2011-08-13T16:37:00+04:00 9 лет, 1 месяц назад
57

Если вы хотите удалить только последнюю строку вашего файла примера


sed -i '/[[:space:]]\+domain\.com/d' test.txt

ответил(а) 2011-08-13T19:11:00+04:00 9 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема