2009-09-29 4 views
9

Nun habe ich eine Datei test.txtWie mache ich Grep beim ersten Match auf einer Linie stoppen?

 
#test.txt 
odsdsdoddf112 test1_for_grep 
dad23392eeedJ test2 for grep 
Hello World test 
garbage 

Ich möchte Strings extrahieren, die einen Raum nach ihnen bekommen haben. Ich folgenden Ausdruck verwendet und es funktionierte

 
grep -o [[:alnum:]]*.[[:blank:]] test.txt 

Sein Ausgang ist

 
odsdsdoddf112 
dad23392eeedJ 
test2 
for  
Hello 
World 

Aber Problem ist grep druckt alle Strings, den Raum hinter ihnen erhalten hat, wo, wie ich es auf nach dem ersten Spiel beenden möge eine Linie und dann zur zweiten Linie fortfahren.

Welchen Ausdruck soll ich hier verwenden, um es nach dem ersten Spiel zu stoppen und zur nächsten Zeile zu wechseln?

Dieses Problem kann mit gawk oder einem anderen Werkzeug gelöst werden, aber ich werde eine Lösung schätzen, die nur grep verwendet.

Bearbeiten Ich benutze GNU Grep 2.5.1 auf einem Linux-System, wenn das relevant ist.

bearbeiten

Mit Hilfe der unten angegebenen Antworten, versuchte ich mein Glück mit

 
grep -o ^[[:alnum:]]* test.txt 
grep -Eo ^[[:alnum:]]+ test.txt 

und beide gaben mir die richtigen Antworten.

Jetzt überrascht mich, was ist, dass ich versuchte

 
grep -Eo "^[[:alnum:]]+[[:blank:]]" test.txt 

als here vorgeschlagen verwenden, aber nicht bekommen, die richtige Antwort. Hier ist die Ausgabe auf meinem Terminal

 
odsdsdoddf112 
dad23392eeedJ 
test2 
for  
Hello 
World 

Aber Kommentare von RichieHindle und Adrian Pronk, zeigt, dass sie eine korrekte Ausgabe auf ihren Systemen einsehen. Jeder mit einer Idee, warum ich auch nicht das gleiche Ergebnis auf meinem System bekomme. Irgendeine Idee? Jede Hilfe wird geschätzt.

bearbeiten

Nun scheint es, dass grep 2.5.1 einige Fehler hat wegen dem meine Ausgabe nicht korrekt war. Ich habe Grep 2.5.4 installiert, jetzt funktioniert es richtig. Einzelheiten finden Sie unter this link.

Antwort

7

Wenn Sie sicher sind, dass Sie keine führenden Leerzeichen haben, fügen Sie ein ^ nur einer Zeile am Anfang übereinstimmen, und ändern Sie die * zu einem + nur anpassen, wenn Sie ein oder mehrere alphanumerische Zeichen lang sein. (Das bedeutet, dass -E hinzugefügt wird, um erweiterte reguläre Ausdrücke zu verwenden).

grep -Eo "^[[:alnum:]]+[[:blank:]]" test.txt 

(Ich entfernte auch die . aus der Mitte, ich bin nicht sicher, was, dass es tat?

)
+0

Ich habe Ihren Befehl in mein Terminal kopiert, aber genau das gleiche Ergebnis erhalten. –

+1

@ andrew-dufresne: Gibt es etwas Seltsames an deiner Textdatei? Probiere 'od -c test.txt' Gibt das die Charaktere an, die du erwartet hast? – RichieHindle

+0

@RichieHindle: Vielen Dank für Ihre schnelle Antwort, ich schätze es sehr. Ich ausgeführt, um den Befehl und bekam die gleichen Zeichen wie in der test.txt –

1
grep -oe "^[^ ]* " test.txt 
+0

Ich habe Ihren Befehl eingefügt und das gleiche Ergebnis erhalten wie zuvor. –

+1

Hmm - funktioniert für mich mit GNU Grep 2.5.3 (Ubuntu Hardy) – BryanH

+0

Sie haben Recht. Meine Grep-Version 2.5.1 war der Schuldige. Installierte 2.5.4 und dein Ausdruck funktionierte. Vielen Dank BryanH. Ich schätze Ihre Hilfe. –

0

Wenn wir alle sinnvollen Eingaben vor Müll extrahieren möchten und tatsächlich auf erstem Spiel zu stoppen dann -B NUM, --before-context=NUM Option „ZAHL Zeilen Kontext vor passenden Linien der führenden“ nützlich sein kann.

Beispiel:

grep --before-context=999999 "Hello World test" 
2

Als Frages entdeckt, ist dies ein bug in Versionen von GNU grep vor 2.5.3. Der Fehler erlaubt es einem Caret, nach dem Ende einer vorherigen Übereinstimmung, nicht nur am Anfang der Zeile, übereinzustimmen.

Dieser Fehler ist immer noch in anderen Versionen von Grep vorhanden, zum Beispiel in Mac OS X 10.9.4.

Es gibt keine universelle Problemumgehung, aber in einigen Beispielen, wie Nicht-Leerzeichen gefolgt von einem Leerzeichen, können Sie häufig das gewünschte Verhalten erzielen, indem Sie das Trennzeichen nicht verwenden. Das heißt, suchen Sie nach '[^ ]*' statt '[^ ]* '.

+0

Veröffentlichen Sie dies als eine Antwort, damit diese Informationen einfacher zu finden sind. –