2009-09-29 20 views
9

Cóż, mam plik test.txtJak zrobić grep zatrzymać przy pierwszym meczu na linii?

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

chcę wyodrębnić ciągi, które posiadają przestrzeń za nimi. Kiedyś następujące wyrażenie i to działało

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

Jego wyjście jest

 
odsdsdoddf112 
dad23392eeedJ 
test2 
for  
Hello 
World 

Ale problemem jest to, drukuje grep wszystkie sznurki, które posiadają przestrzeń za nimi, gdzie, jak chcę go zatrzymać po pierwszym meczu na linię, a następnie przejdź do drugiej linii.

Które wyrażenie należy tutaj użyć, aby zatrzymać się po pierwszym dopasowaniu i przejść do następnej linii?

Ten problem może zostać rozwiązany za pomocą gawk lub innego narzędzia, ale doceniam rozwiązanie, które używa tylko grep.

Edycja Używam GNU grep 2.5.1 na systemie Linux, jeśli jest to istotne.

Edit

Z pomocą odpowiedzi udzielonych poniżej, próbowałem szczęścia z

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

i oba dał mi poprawnych odpowiedzi.

Teraz co zaskakuje mnie to, że próbowałem za pomocą

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

jak sugeruje here ale nie dostać poprawną odpowiedź. Oto wynik na moim terminalu

 
odsdsdoddf112 
dad23392eeedJ 
test2 
for  
Hello 
World 

Ale komentarze od RichieHindle i Adrian Pronka pokazuje, że dostali prawidłowego wyjścia na swoich systemach. Ktoś, kto ma jakieś pojęcie, dlaczego ja też nie osiągam tego samego wyniku w moim systemie. Dowolny pomysł? Każda pomoc zostanie doceniona.

Edit

Cóż, wydaje się, że grep 2.5.1 ma jakiś błąd, z powodu której moja moc nie była prawidłowa. Zainstalowałem grep 2.5.4, teraz działa poprawnie. Aby uzyskać szczegółowe informacje, patrz: this link.

Odpowiedz

7

Jeśli masz pewność, że nie mają wiodącą spacje, dodać ^ dopasować tylko na początku linii, a zmienić * do + dopasować tylko wtedy, gdy masz jeden lub więcej znaków alfanumerycznych. (Oznacza to dodanie -E do korzystania z rozszerzonych wyrażeń regularnych).

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

(ja również usunięte . z połowy; nie jestem pewien, co to tu robi?)

+0

Skopiowałem twoje polecenie do mojego terminalu, ale otrzymałem dokładnie taki sam wynik. –

+1

@ andrew-dufresne: Czy jest coś dziwnego w twoim pliku tekstowym? Spróbuj 'od -c test.txt' Czy to oznacza znaki, które spodziewałeś się zobaczyć? – RichieHindle

+0

@RichieHindle: Dzięki za szybkie odpowiedzi, naprawdę to doceniam. I wykonał polecenie i dostaje te same znaki jak w Test.txt –

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

Wkleiłem twoje polecenie i otrzymałem taki sam rezultat jak wcześniej. –

+1

Hmm - działa dla mnie z GNU Grep 2.5.3 (Ubuntu Hardy) – BryanH

+0

Masz rację. Moja grep wersja 2.5.1 była winowajcą. Zainstalowany 2.5.4 i twoje wyrażenie działa. Wielkie dzięki, BryanH. Doceniam twoją pomoc. –

0

Jeśli chcemy, aby wyodrębnić wszystkie znaczące wejście przed śmieci i rzeczywiście zatrzymuje się na pierwszym meczu następnie -B NUM, --before-context=NUM opcja może być przydatna do „print NUM wiodących linii kontekstu przed pasującymi liniami”.

przykład:

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

Jako pytającego odkryto, to bug w wersji GNU grep przed 2.5.3. Błąd pozwala karetce dopasować się po zakończeniu poprzedniego meczu, a nie tylko na początku linii.

Ten błąd nadal występuje w innych wersjach grep, na przykład w systemie Mac OS X 10.9.4.

Nie ma uniwersalnego rozwiązania, ale w niektórych przykładach, takich jak spacja, po której następuje spacja, często można uzyskać pożądane zachowanie, opuszczając ogranicznik. Oznacza to, że należy poszukać wartości '[^ ]*' zamiast '[^ ]* '.

+0

Umieszczenie tego jako odpowiedzi, aby łatwiej było znaleźć tę informację. –

Powiązane problemy