2016-03-30 19 views
0

Ich möchte Grep in einem Bash-Skript verwenden, um die Zeile mit nur dem Wort "Version" aus einer Datei zu bekommen, das Problem ist, dass ein paar Zeilen weiter unten in der Datei, die ich will Skript, um darin zu suchen, ist eine andere Linie mit dem Wort "dlversion".Grep muss mit einem bestimmten Wort übereinstimmen

Ich bin der grep in einen Schnittbefehl kochend, wird die Ausgabe als Variable

gespeichert werden Das Problem ist, dass es entweder nichts in die Variable speichert oder es speichert beide Linien habe ich bereits mehrere Methoden ausprobiert das habe ich gefunden, obwohl keiner von ihnen funktioniert hat.

grep -Fx version /path/to/file.txt | cut -c9- 

output = nichts

grep '^version$' /path/to/file.txt | cut -c9- 

output = nichts

grep "version" /path/to/file.txt | cut -c9- 

output = beide Leitungen

auch versucht

grep -w "version " /path/to/file.txt | cut -c9- 

output = nichts

Ich habe auch versucht, -F, -x zu verwenden, was auch dazu führte, dass die Variable keinen Wert hatte.

+0

Es scheint, dass die Verwendung von Grenzen Ihnen helfen könnte: "\ bversion \ b". – Dominique

+0

Danke, ich habe den 'cut' geändert, um beim ersten Zeichen zu beginnen, dann habe ich den Ausgang des ersten' grep' durch einen zweiten mit '-v' gefiltert, der die restlichen Buchstaben herausgefiltert hat und es funktioniert. –

Antwort

1

Sie haben ein paar Optionen, abhängig von Ihrer Version von Grep.

Wenn unterstützt, ist die beste Option Wortgrenzen \b auf beiden Seiten Ihres Wort verwenden:

grep '\bversion\b' /path/to/file.txt 

Oder:

grep '\<version\>' /path/to/file.txt 

Wo \< und \> Spiel die leere Zeichenkette am Anfang und Ende eines Wortes jeweils.

Andernfalls können Sie Ihren eigenen Zeichensatz erstellen, die Sie berücksichtigen nicht ein Wort sein:

grep -E '(^|[[:space:][:punct:]])version' /path/to/file.txt 

Das paßt „Version“, voran entweder durch den Anfang der Zeile oder jede Art von Raum oder Interpunktion.

In Ihrem speziellen Fall könnten Sie so etwas wie folgt verwenden:

grep -E '(^|[^l])version' /path/to/file.txt 

Dies wird durch „Version“ voran entspricht entweder der Anfang der Zeile oder etwas anderes ist als ein „l“.

Als Antwort auf Ihren Kommentar:

  • ^ entspricht dem Anfang der Zeile.
  • | bedeutet "oder".
  • [^l] ist ein Klammerausdruck, wobei das ^ als das erste Zeichen "nicht" bedeutet (so dass dies mit jedem Zeichen außer "l" übereinstimmt).
  • Die Klammern werden verwendet, um eine Gruppe zu erstellen, so dass das "oder" nur für diesen Teil des Musters gilt.
+0

Vielen Dank! Die Version von Grep, die ich verwende, unterstützt keine Grenzen. Die Antwort, die Sie vorgeschlagen haben, funktionierte jedoch. Und da ich neugierig bin und Dinge verstehen will, die ich später vielleicht anwenden könnte, könntest du erklären, was das '^ |' und das '[^ l]' genau machen? –

+0

Ich aktualisierte die Antwort, um jeden Teil zu erklären. –

+0

Vielen Dank. –

1

Bei allen hoch entwickelten Tricks versagen, verwenden Sie die Brute-Force: Rohr das Ergebnis durch einen weiteren grep Prozess die Zeilen mit unerwünschten Worte herauszufiltern (verwenden -v Option für diese):

grep 'version' sourcefile | grep -v 'dlversion' > destination 
+0

Brute Forcing hat perfekt funktioniert. Vielen Dank. –

Verwandte Themen