Как мне взять список и удалить его из файла?

10

У меня есть длинный список доменных имен, которые мне нужно удалить из / etc / remotedomains. Они, вероятно, не в каком-то определенном порядке в файле. Каждый домен находится в одной строке.

Как я могу перебрать список, найти эту строку в удаленных доменах и удалить ее.

xenoterracide
источник

Ответы:

11
grep -Fxf list -v /etc/remotedomains > remotedomains.new
mv remotedomains.new /etc/remotedomains

Команда -vgrep указывает только те строки, которые не соответствуют шаблону.

Команда -f listgrep сообщает, что нужно читать шаблоны из файла list.

Команда -Fgrep сообщает, что шаблоны следует интерпретировать как простые строки, а не как регулярные выражения (чтобы у вас не возникало проблем с метасимволами регулярных выражений).

Команда -xgrep указывает на совпадение всей строки, например, если есть шаблон, fooкоторый должен удалять только строку foo, а не строку foobarили barfoo.

sepp2k
источник
3
примечание: всегда помните, чтобы сделать резервную копию /etc/localdomainsи /etc/remotedomainsпрежде чем делать такие вещи, как это.
ксенотеррацид
3
-Fпредназначен для сопоставления с фиксированной строкой («точное совпадение»), но оно не заставляет шаблон соответствовать всей строке. POSIX указывает -xфлаг, ограничивающий совпадения для случаев, когда шаблон соответствует всей строке.
Крис Джонсен
@ Крис: Бах, хороший улов.
sepp2k
1

Используйте комм!

comm -23 /etc/remotedomains remove

Со страницы руководства:

Сравните отсортированные файлы FILE1 и FILE2 построчно.

Без опций выведите три столбца. Первый столбец содержит строки, уникальные для FILE1, второй столбец содержит строки, уникальные для FILE2, а третий столбец содержит строки, общие для обоих файлов.

Опции -1, -2 и -3 отключают соответствующие столбцы.

Однако он требует, чтобы файлы были отсортированы.

JGR
источник
0

sed -r -i -e '/^(domain1|domain2|domain3|...|domainN)$/d' domainlist.txt

Если ваш список доменов для удаления находится в файле, то:

sed -r -i -e '/^'"$(xargs <removelist.txt|sed -e 's/ /|/g)"')$/d' domainlist.txt

Заметки:

  1. Используйте -i.bak, чтобы sed сделал резервную копию domainlist.txt

  2. Если в removelist.txt содержится много тысяч записей, это может привести к переполнению максимальной длины командной строки. Это не очень вероятный сценарий, но вы должны знать о нем.

При дальнейшем рассмотрении этот риск можно устранить с помощью:

for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
  do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done
саз
источник