Баш - найти ключевое слово в файле и удалить его строку [дубликат]

этот вопрос уже есть ответ здесь:

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

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

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

обновление

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

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

внимание:

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

  • Я автоматически избегаю точек доменного имени.

3 ответов


использовать редактор потока, sed:

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

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


передайте его в другой файл, а не тот, из которого Вы читаете, и будьте осторожны с бесполезным использованием 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 прилагается.


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

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