2009-09-29 19 views
9

Eh bien, je dispose d'un fichier test.txtComment faire pour arrêter grep au premier match sur une ligne?

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

Je veux extraire les chaînes qui ont obtenu un espace après eux. Je l'expression suivante et cela a fonctionné

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

Sa sortie est

 
odsdsdoddf112 
dad23392eeedJ 
test2 
for  
Hello 
World 

Mais le problème est imprime grep toutes les cordes qui ont obtenu l'espace après les, où que je le veux arrêter après le premier match sur une ligne et ensuite passer à la deuxième ligne.

Quelle expression dois-je utiliser ici, afin de le faire arrêter après la première correspondance et passer à la ligne suivante?

Ce problème peut être résolu avec gawk ou un autre outil, mais j'apprécierai une solution qui utilise uniquement grep.

Édition J'utilise GNU grep 2.5.1 sur un système Linux, si cela est pertinent.

Modifier

Avec l'aide des réponses ci-dessous, j'ai essayé ma chance avec

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

et les deux m'a donné les bonnes réponses.

Maintenant, ce qui me surprend est que j'ai essayé d'utiliser

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

comme suggéré here mais n'a pas obtenu la bonne réponse. Voici la sortie de mon terminal

 
odsdsdoddf112 
dad23392eeedJ 
test2 
for  
Hello 
World 

Mais les commentaires de RichieHindle et Adrian Pronk, montre qu'ils ont obtenu une sortie correcte sur leurs systèmes. Quelqu'un avec une idée de ce pourquoi je ne reçois pas le même résultat sur mon système. Une idée? Toute aide serait appréciée.

Modifier

Eh bien, il semble que grep 2.5.1 a un bug à cause duquel ma sortie n'a pas été correcte. J'ai installé grep 2.5.4, maintenant il fonctionne correctement. S'il vous plaît voir this link pour plus de détails.

Répondre

7

Si vous êtes sûr que vous n'avez pas leader des espaces, ajoutez un ^ pour correspondre seulement au début d'une ligne, et changer le * à un + pour correspondre uniquement lorsque vous avez un ou plusieurs caractères alphanumériques. (Cela signifie ajouter -E pour utiliser des expressions régulières étendues).

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

(j'ai aussi enlevé la . du milieu, je ne suis pas sûr de ce qui était là?)

+0

J'ai copié votre commande sur mon terminal mais j'ai obtenu exactement le même résultat. –

+1

@ andrew-dufresne: Y a-t-il quelque chose d'étrange dans votre fichier texte? Essayez 'od -c test.txt' Est-ce que cela montre les caractères que vous attendiez? – RichieHindle

+0

@RichieHindle: Merci pour vos réponses rapides, je l'apprécie vraiment. J'exécutant la commande et a obtenu les mêmes caractères que dans le test.txt –

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

J'ai collé votre commande et j'ai obtenu le même résultat que précédemment. –

+1

Hmm - fonctionne pour moi avec GNU Grep 2.5.3 (Ubuntu Hardy) – BryanH

+0

Vous avez raison. Ma version grep 2.5.1 était le coupable. Installé 2.5.4 et votre expression a travaillé. Merci beaucoup BryanH. J'apprécie ton aide. –

0

Si nous voulons extraire toutes les entrées significatives avant ordures et fait arrêter le premier match puis l'option -B NUM, --before-context=NUM peut être utile pour « imprimer des lignes NUM de contexte initial avant les lignes correspondant ».

Exemple:

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

Comme le questionneur découvert, c'est un bug dans les versions de GNU grep avant 2.5.3. Le bug permet à un caret de correspondre après la fin d'un match précédent, pas seulement au début de la ligne.

Ce bug est toujours présent dans d'autres versions de grep, par exemple dans Mac OS X 10.9.4.

Il n'existe pas de solution de contournement universelle, mais dans certains exemples, comme les espaces non-espaces suivis d'un espace, vous pouvez souvent obtenir le comportement souhaité en quittant le délimiteur. Autrement dit, recherchez '[^ ]*' au lieu de '[^ ]* '.

+0

Publier cela comme une réponse pour que cette information soit plus facile à trouver. –

Questions connexes