Wie man grep Anschlag am ersten match auf einer Linie?
Gut, ich habe eine Datei test.txt
#test.txt odsdsdoddf112 test1_for_grep dad23392eeedJ test2 für grep Hallo Welt test Müll
Möchte ich zum extrahieren von Zeichenfolgen, die haben ein Platz nach Ihnen. Ich folgenden Ausdruck verwendet und es funktionierte
grep -o " [[: alnum:]]*.[[:blank:]] test.txt
Seine Ausgabe ist
odsdsdoddf112 dad23392eeedJ test2 für Hallo Welt
Aber problem ist grep gibt alle Zeichenfolgen, die haben den Raum nach Ihnen, wo, wie ich will, es zu stoppen, nachdem das erste match auf einer Linie und gehen dann zur zweiten Zeile.
Welchen Ausdruck soll ich hier, um es zu stoppen nach dem ersten match und weiter zur nächsten Zeile?
Dieses problem kann gelöst werden mit gawk oder andere tool, aber ich Schätze eine Lösung, die über grep nur.
Bearbeiten
Ich habe es mit GNU grep 2.5.1 auf einem Linux-system, falls das relevant ist.
Bearbeiten
Mit Hilfe der Antworten, die unten gegeben werden, versuchte ich mein Glück mit
grep -o ^[[:alnum:]]* test.txt grep -Eo ^[[:alnum:]]+ test.txt
und beide Gaben mir die richtigen Antworten.
Nun, was mich wundert, ist, dass ich versucht, mit
grep -Eo "^[[:alnum:]]+[[:blank:]]" test.txt
vorgeschlagen hier aber nicht die richtige Antwort.
Hier ist die Ausgabe auf meinem terminal
odsdsdoddf112 dad23392eeedJ test2 für Hallo Welt
Aber Kommentare von RichieHindle und Adrian Pronk, zeigt, dass Sie auf die korrekte Ausgabe auf Ihren Systemen. Jeder mit etwas Ahnung, der Grund, warum auch ich bin nicht immer das gleiche Ergebnis bei meinem system. Irgendeine Idee? Jede Hilfe wird geschätzt.
Bearbeiten
Gut, es scheint, dass grep-2.5.1 hat einige Fehler, weil von denen meine Ausgabe war nicht korrekt. Ich installierte grep-2.5.4, jetzt ist es korrekt funktioniert. Bitte sehen dieser link für details.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie sicher sind, dass Sie keine führenden Leerzeichen, fügen Sie ein
^
passend nur zu Beginn einer Zeile, und ändern Sie die*
zu einem+
übereinstimmen, nur, wenn Sie haben ein oder mehrere alphanumerische Zeichen. (Das bedeutet, dass das hinzufügen-E
erweiterte reguläre Ausdrücke).(Ich habe auch entfernt die
.
von der Mitte; ich bin nicht sicher, was das hier war?)od -c test.txt
Hat, die zeigen, dass die Zeichen, die Sie erwartet hatten zu sehen?Als den fragenden vor, dies ist ein bug in Versionen von GNU grep vor 2.5.3. Der bug ermöglicht es einem caret-Zeichen entsprechen nach dem Ende eines vorherigen Spiel, nicht nur am Anfang der Zeile.
Dieser bug ist noch vorhanden, in anderen Versionen von grep, die zum Beispiel in Mac OS X 10.9.4.
Gibt es nicht eine Universelle Abhilfe, aber in der einige Beispiele, wie nicht-Leerzeichen, gefolgt durch ein Leerzeichen, können Sie oft das gewünschte Verhalten durch verlassen der Trennzeichen. Also Suche für
'[^ ]*'
eher als'[^ ]* '
.Wenn wir wollen, zu extrahieren alle sinnvollen Eingaben vor Müll und eigentlich aufhören auf das erste match dann
-B NUM, --before-context=NUM
option kann nützlich sein, um "print NUM Zeilen Kontext führenden vor dem matching lines".Beispiel: