Wie nehme ich eine Liste und entferne sie aus einer Datei?

10

Ich habe eine lange Liste von Domain-Namen, die ich aus / etc / remotedomains entfernen muss. Sie sind wahrscheinlich nicht in einer bestimmten Reihenfolge in der Datei. Jede Domain befindet sich in einer Zeile.

Wie könnte ich die Liste durchlaufen und diese Zeile in entfernten Domänen finden und entfernen?

Xenoterracid
quelle

Antworten:

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

Das -vweist grep an, nur Zeilen auszugeben, die nicht mit dem Muster übereinstimmen.

Das -f listweist grep an, die Muster aus der Datei zu lesen list.

Das -Fweist grep an, die Muster als einfache Zeichenfolgen und nicht als reguläre Ausdrücke zu interpretieren (damit Sie keine Probleme mit Regex-Metazeichen haben).

Das -xsagt grep, dass es mit der gesamten Zeile übereinstimmen soll, z. B. wenn es ein Muster gibt foo, das nur die Zeile entfernen soll foo, nicht die Zeile foobaroder barfoo.

sepp2k
quelle
3
Hinweis: immer daran denken , zu sichern /etc/localdomainsund /etc/remotedomainsvor Sachen wie dies zu tun.
Xenoterracide
3
-Fist für den festen String-Abgleich („exakte Übereinstimmungen“) vorgesehen, erzwingt jedoch nicht , dass das Muster mit der gesamten Zeile übereinstimmt. POSIX gibt das -xFlag an, um Übereinstimmungen auf Fälle zu beschränken, in denen ein Muster mit der gesamten Zeile übereinstimmt.
Chris Johnsen
@ Chris: Bah, guter Fang.
sepp2k
1

Verwenden Sie comm!

comm -23 /etc/remotedomains remove

Von der Manpage:

Vergleichen Sie die sortierten Dateien FILE1 und FILE2 zeilenweise.

Erstellen Sie ohne Optionen eine dreispaltige Ausgabe. Spalte eins enthält Zeilen, die für FILE1 eindeutig sind, Spalte zwei enthält Zeilen, die für FILE2 eindeutig sind, und Spalte drei enthält Zeilen, die beiden Dateien gemeinsam sind.

Die Optionen -1, -2 und -3 deaktivieren die jeweiligen Spalten.

Es ist jedoch erforderlich, dass Dateien sortiert werden.

jgr
quelle
0

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

Wenn sich Ihre Liste der zu löschenden Domains in einer Datei befindet, gehen Sie wie folgt vor:

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

Anmerkungen:

  1. Verwenden Sie -i.bak, um eine Sicherungskopie von domainlist.txt zu erstellen

  2. Wenn removeelist.txt viele tausend Einträge enthält, kann die maximale Befehlszeilenlänge überlaufen. Dies ist kein sehr wahrscheinliches Szenario, aber etwas, das Sie beachten sollten.

Bei weiterer Überlegung kann dieses Risiko beseitigt werden mit:

for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
  do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done
cas
quelle