2009-11-01 13 views
1

Je dois filtrer toutes les lignes avec des mots commençant par une lettre suivie de zéro ou plusieurs lettres ou chiffres, mais pas de caractères spéciaux (essentiellement des noms qui pourraient être utilisés pour une variable C++).Expression régulière Script shell Unix

egrep '^[a-zA-Z][a-zA-Z0-9]*' 

Cela fonctionne très bien pour des mots tels que « un », « AB10 », mais il comprend aussi des mots comme « b.b ». Je comprends que * à la fin de l'expression est un problème. Si je remplace * par + (un ou plusieurs), il ignore les mots qui contiennent une seule lettre, donc cela n'aide pas.

EDIT: Je devrais être plus précis. Je veux trouver des lignes avec n'importe quel nombre de mots possibles comme décrit ci-dessus. Voici un exemple:

int = 5; 
cout << "hello"; 
//some comments 

Dans ce cas, il doit imprimer toutes les lignes ci-dessus comme tous comprennent au moins un mot qui adapte les conditions décrites, et la ligne n'a pas commencé par la lettre.

+0

Un problème ici est que^fait référence au début d'une ligne, mais vous êtes intéressé par n'importe quelle ligne contenant un mot. Je suggère une modification. – JXG

Répondre

5

Votre solution ressemblera à peu près à cet exemple. Dans ce cas, l'expression régulière exige que le mot soit précédé d'un espace ou d'un début de ligne, suivi d'un espace ou d'une fin de ligne. Vous devrez modifier les exigences de limite (les éléments entre parenthèses) si nécessaire.

'(^|)[a-zA-Z][a-zA-Z0-9]*(|$)' 
+0

C'est exactement ce que je cherchais. Merci beaucoup!!! – Mike55

1

En supposant que la ligne se termine après le mot:

'^[a-zA-Z][a-zA-Z0-9]+|^[a-zA-Z]$' 
+0

Je ne savais pas que vous pouvez utiliser "OR" avec regex. Cela le rend beaucoup plus facile. Merci. – Mike55

0

Vous devez ajouter quelque chose. Il se peut que le reste soit des espaces blancs ou que vous puissiez simplement ajouter la fin de la ligne. (AFAIR c'était $)

0

Votre problème réside dans les ancres ^ et $ qui correspondent au début et à la fin de la ligne respectivement. Vous souhaitez que la ligne correspondant si elle ne contient un mot, se débarrasser des points d'ancrage fait ce que vous voulez:

egrep '[a-zA-Z][a-zA-Z0-9]+' 

Notez les + matchs mots de longueur 2 et plus, un * à cet endroit serait Signel caractères trop .

Questions connexes