sed - löscht Zeilen, die Muster aus einer externen Datei nehmen

497
faceless

Ich suche nach einer Möglichkeit, bestimmte Zeilen in einer Datei zu löschen, die Muster aus einer externen Datei nimmt. Der beste Weg wäre, sed zu verwenden. Ich habe versucht, einige Artikel, wie diese, aber sie ist nicht meine Aufgabe zu beantworten.

Angenommen, ich habe eine Textdatei mit:

Adam Belle Candy Donald Eve 

Und eine Musterdatei hat:

Don* Candy 

Mit grep -fv pattern.file text.filebekomme ich genau das, was ich will, aber nur im Blickfeld:

Adam Belle Eve 

Ich kann die gefilterte Ausgabe nicht in eine neue Datei umleiten. Daher brauche ich eine Möglichkeit, die ursprüngliche text.file zu ändern, indem ich alle Zeilen lösche, die den Mustern aus der externen Datei entsprechen.

In meiner realen Anwendung enthält die Textdatei nicht alphabethische Reihenfolge, die nicht immer großgeschrieben wird. Daher ist es nicht möglich, einen generischen Regex für 'sed' zu erstellen.

Was wäre der beste Ansatz, um Muster für das Löschen von Zeilen aus einer externen Datei zu übergeben?

1
Warum können Sie die Ausgabe nicht in eine neue Datei umleiten? `sed -i` erstellt sowieso eine neue Datei hinter den Kulissen. choroba vor 5 Jahren 0
@choroba - Verlust von Privilegien. Kann nur ändern faceless vor 5 Jahren 0
Also vielleicht 'Schwamm', um die Ausgabe in * dieselbe * Datei umzuleiten. Kamil Maciorowski vor 5 Jahren 1
Das könnte funktionieren: `grep -vf pattern.file text.file> foo; cp foo text.file & rm foo` Cyrus vor 5 Jahren 1

1 Antwort auf die Frage

1
Cyrus

Mit GNU sed und bash:

sed -i -f <(sed 's|.*|/&/d|' pattern.file) text.file 
Diese Art von Arbeiten, aber nicht unbedingt aus den richtigen Gründen. (1) Es erfolgt eine nicht verankerte Übereinstimmung. Wenn die Musterdatei "Alex" enthält, werden "Alexander" und "Alexandra" aus der Textdatei entfernt. (2) Sie erwartet, dass die Muster reguläre Ausdrücke sind. Es sieht nicht so aus, als beabsichtigte das OP. Zum Beispiel * für die angegebene Musterdatei würde * "Douglass" gelöscht, da "Don" für jede Zeile steht, die "Do" enthält. (Wenn eine zufällige Folge von 'n' folgt, ist das nicht von Belang.) (3) Der Benutzer sollte gewarnt werden, dass die Musterdatei fehlschlägt, wenn die Musterdatei Schrägstriche (`/`) enthält. Scott vor 5 Jahren 0
Danke @Cyrus, das war es, wonach ich gesucht hatte! Scott, ich danke Ihnen auch, die zur Verfügung gestellte Antwort passt zu meinem speziellen Pattern-Management, aber ich werde Ihre Notizen in Augenschein nehmen. faceless vor 5 Jahren 0