Як взяти список і видалити його з файлу?


10

У мене довгий список імен домену, які потрібно видалити з / etc / Remotedomains. Вони, мабуть, не в якомусь конкретному порядку у файлі. Кожен домен знаходиться в одному рядку.

Як я можу повторити список і знайти цей рядок у віддалених доменах і видалити його.

Відповіді:


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

-vКаже Grep тільки вихідні лінії , які не відповідають шаблоном.

-f listКаже Grep читати шаблони з файлу list.

-FКаже Grep інтерпретувати моделі як прості рядки, а не регулярні вирази (так що ви не зіткнетеся з проблемами з регулярних виразів мета-символи).

-xКаже Grep , щоб відповідати всій лінії, наприклад , якщо є шаблон , fooякий повинен тільки видалити рядок foo, а НЕ лінію foobarабо barfoo.


3
Примітка: завжди пам’ятайте про резервне копіювання /etc/localdomainsта /etc/remotedomainsперед тим, як робити такі речі.
ксенотерацид

3
-Fпризначений для фіксованого узгодження рядків ("точні збіги"), але він не змушує шаблон узгоджувати весь рядок. POSIX вказує -xпрапор, щоб обмежити відповідність випадкам, коли шаблон відповідає всій лінії.
Кріс Джонсен

@Chris: Ба, хороший улов.
sepp2k

1

Використовуйте кому!

comm -23 /etc/remotedomains remove

На чоловіковій сторінці:

Порівняйте відсортовані файли FILE1 та FILE2 рядок за рядком.

Не маючи жодних варіантів, виробляйте вихід з трьох стовпців. Перша колонка містить рядки, унікальні для FILE1, друга колонка містить рядки, унікальні для FILE2, а третя колонка містить рядки, загальні для обох файлів.

Опції -1, -2 та -3 вимикають відповідні стовпці.

Однак для цього потрібні сортування файлів.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.