2012-03-25 8 views
0

Ich habe eine Anforderung, Zeile für Zeile zu lesen und eine piped Grep-Anweisung zu konstruieren, um diese Muster mit dem Flag -v zu beseitigen, dh ich habe eine Datei, sagen negativelist, die folgende Muster umfasst:Escape-Sternchen und andere Sonderzeichen im Shell-Skript

Hello 
World 
Java 

Somit lesen ich diese Datei Zeile für Zeile und konstruieren, die verrohrt grep Anweisung wie folgt diese Muster aus einer Musterdatei zu beseitigen, inputfile

grep -v "Hallo" Eingabedatei | grep -v "Welt" | grep -v "Java"

Ich habe jedoch Probleme beim Erklären von Sonderzeichen in der Negativliste. Während ich normalerweise grep -v '*' Eingabedatei verwenden würde, um alle Zeilen zu entfernen, die das Sternchen enthalten, kann ich nicht scheinen, dass dies funktioniert. Die Sternchen mit einfachen Anführungszeichen in der Negativliste zu entgehen scheint nicht zu helfen. Irgendwelche Gedanken darüber, wie ich dem Sternchen entfliehen sollte, damit ich Linien, die es enthalten, eliminieren kann, indem ich meinen aktuellen Ansatz benutze, jede Zeile aus der Negativliste mit doppelten Anführungszeichen zu umschreiben?

Um zu klären, ich folgenden Satz von Einschränkungen haben:

  • Die grep verrohrt Zeichenfolge durch ein Skript in der folgenden Form aufgebaut ist: grep -v "line1 von negativelist" Eingabedatei | grep -v „line2 von negativelist ... und so weiter
  • Des Weiteren wird dieses Skript diesen Befehl grep und speichert seine Ausgabe in einer anderen Datei.
  • Ich kann nur das, was die Steuerung geht zwischen den doppelten Anführungszeichen durch die Muster in dem negativelist definieren. ich kann nicht ändern, das Skript generiert diese verrohrt grep Aussagen
  • Auch dachte ich, um die gewünschte Ausgabe zu erhalten durch grep „*“ Eingabedatei von der Kommandozeile ausgeführt wird, speichert einfach * in der Negativliste erzeugt nicht das gewünschte Ergebnis des Entfernens aller Zeilen, die ein a enthalten Sterisk in ihnen.
  • Ferner ist ein Muster, wie Hallo definieren. * Welt Alle Zeilen der Form zu beseitigen

    Hellotest1World oder

    Hellotest2World

wenn definiert im negativelist doesn‘ t scheint zu funktionieren entweder möglicherweise der Stern ist nicht korrekt maskiert. Die folgende Anweisung in der Befehlszeile korrekt funktioniert: grep -v „Hallo * World“ Eingabedatei , dh es entfällt korrekt alle Linien Hallo enthält ein beliebiges Zeichen folgt (n) zwischen

von World gefolgt

Antwort

2

Sie sollten Verwenden Sie fgrep anstelle von nur grep, die eine exakte Übereinstimmung durchführt, ohne etwas zu erweitern.

Ex:

$ cat /tmp/a 
aaa 
zzz 
eee 
*** 
rrr 
ttt 
yyy 

$ fgrep -v -e 'aaa' -e '*' -e zzz -e yyy /tmp/a 
eee 
rrr 
ttt 
+0

Dank für diesen Vorschlag. Angenommen, ich kann fgrep nicht verwenden, da das Skript, das diese piped-Anweisungen erstellt, nicht etwas ist, das ich kontrolliere, haben Sie irgendwelche anderen Vorschläge? – Rishabh

+0

Beitrag bearbeitet. Was kontrollierst du? 'grep' kann auch so verwendet werden:' grep '\ *' ' –

+0

Das Skript, das die piped grep-Anweisung generiert, umgibt jede Zeile der * Negativliste * mit doppelten Anführungszeichen. Gedanken darüber, wie ich das Sternchen in der * Negativliste * unter dieser Einschränkung deklarieren sollte? – Rishabh

Verwandte Themen