2017-09-13 2 views
0

Ich möchte Katze Ausgabe der Datei zu einem sed Muster pipline. Angenommen, ich habe 2 Dateien: color.txt und duplicate.txt. color.txt enthält 3 Farben: blau, grün, rot und duplicate.txt enthält grün. Ich möchte sed verwenden, um grün aus color.txt Datei zu löschen.Wie Pipeline Katze zu sed Muster

Ich versuche, so etwas wie dieses:

cat duplicate.txt | sed "/$/d" < color.txt 

Leider funktioniert es nicht. Irgendwelche Vorschläge, wie man das macht?

+1

* nichts utils im Allgemeinen arbeiten können auf Dateien und auf diese Art und Weise Katze verwenden, sind im Großen und Ganzen ein „[UUOC] (http://porkmail.org/era/unix/award.html)“ zu sein ... ein "betrachtet nutzloser Gebrauch der Katze ". Wie Sie in den Antworten sehen werden, verwenden sie in der Regel nicht "Katze". –

Antwort

0

Ich glaube, Sie dies bedeuten:

sed "/$(cat duplicate.txt)/d" color.txt 

Doch wie Sie aus den Kommentaren sagen kann, ist dieser Ansatz nicht sehr ratsam ist. Ich fordere Sie auf, eine der anderen Lösungen zu verwenden. Ich werde diese Antwort jedoch nicht löschen, da sie die Technik zeigt, die Sie lernen wollten.

+2

Würde dies nicht zu einem Syntaxfehler führen, wenn duplicate.txt mehr als eine Zeile hat? Außerdem werden Zeilen gelöscht, die teilweise übereinstimmen. Ich bin mir nicht sicher, ob OP das will. – codeforester

+0

@codeforester Ja, nahm ich die Frage dort bedeuten nur eine Zeile gegeben wegen des Beispiels war und die Tatsache, dass es * „Duplikat“ genannt wird * und nicht * „Duplikate“ *. Obwohl ich von dieser Logik denke, es sollte * „colors.txt“ werden *, aber es ist nicht :-) –

+0

Die teilweise Übereinstimmungen durch das Hinzufügen von Wortgrenzen überwunden werden konnte, aber auch hier war OP in dieser Angelegenheit nicht spezifisch.Ich habe versucht, die Technik zu demonstrieren, nach der OP gefragt hat - nämlich, wie man den Inhalt einer Datei als Muster für "sed" verwendet. Ich stimme zu, dass Ihre Lösung technisch genauer ist, meine ist näher an dem Konzept OP zu sein versucht zu erreichen - mit dem Titel. Ich werde für deine wählen –

2

Sie grep verwenden können, um zu erreichen, was Sie wollen:

grep -Fxvf duplicate.txt color.txt 
  • -F Linien in duplicate.txt als Strings anstatt Muster zu behandeln
  • -x ganze Linien in color.txt
  • übereinstimmen
  • -v zum Extrahieren von Zeilen, die nicht übereinstimmen
  • -f, um Strings von duplicate.txt zu übernehmen match with color.txt

Dies funktioniert unabhängig davon, wie viele Muster Ihre Dateien haben. Für extrem große Dateien, können Sie einen Blick auf diesen Posten zu übernehmen wollen:

2

Während in diesem Fall die grep Lösung genug, manchmal benutze ich einen Befehl wie diesen :

sed 's|.*|/^\1$/d|' duplicate.txt | sed -i -f - color.txt

Hier ist der erste sed Aufruf convert s jede Zeile von duplicate.txt in einen richtigen sed Befehl, um genau zu löschen, was benötigt wird. Dies führt zu einem sed Skript, das dann an den zweiten sed geleitet wird -f - mit denen der - bedeutet Dateiname Standardeingabe.

Verwandte Themen