Sed to Modfiy Hosts Файл

Sed to Modfiy Hosts Файл

У меня есть текстовый файл, modifyhostslist.txt, который содержит записи, соответствующие записям, найденным в моем hostsфайле. Не каждую запись в моем hostsфайле нужно изменять, только записи, также найденные в modifyhostslist.txt.

Найденные записи modifyhostslist.txtнеобходимо закомментировать в hostsфайле.

Пример строки (записи) найден в modifyhostslist.txt:127.0.0.1 www.domain.com

Ниже приведена последовательность комментариев:#%%#

Я пытался использовать sedдля выполнения задачи, но пока безуспешно. Вот моя последняя попытка:

while read line; do 
   sed -i 's/'"$line"'/#%%#'"$line"'/' /system/etc/hosts;
done < modifyhostslist.txt

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

Кажется, эта awkкоманда может работать, но я не уверен, как ее использовать.

решение1

Вы использовали команду:

while read line; do 
   sed -i 's/'"$line"'/#%%#'"$line"'/' /system/etc/hosts;
done < modifyhostslist.txt

Если строки в modifyhostslist.txtсовпадают со строками в /system/etc/hosts, эта команда действительно должна работать.

Если строки выглядят одинаково на глаз, но команда все равно не работает, причиной может быть несоответствие между (невидимыми) окончаниями строк. Файлы DOS/Windows имеют двухсимвольные окончания строк, тогда как Unix и Mac используют односимвольные окончания строк. Если проблема в этом, решение заключается в удалении ненужных символов. Поскольку hostsэто файл системы Unix, я ожидаю, что у него правильные окончания строк, и поэтому нам нужно удалить лишние \rсимволы из modifyhostslist.txt файла. Это можно сделать следующим образом:

while read line; do 
   sed -i 's/'"$(echo "$line" | tr -d '\r')"'/#%%#'"$line"'/' /system/etc/hosts;
done < modifyhostslist.txt

Связанный контент