Bash/shell : tester présence caractères spéci

Résolu/Fermé
Tranchoir - 21 févr. 2012 à 18:23
 Utilisateur anonyme - 22 févr. 2012 à 11:47
Bonjour,

j'essaie de "matcher" la présence de crochets [ ] (l'un ou l'autre ou les 2) dans une variable avec le retour de grep
Mais je n'y arrive pas... voyez ceci :

$echo "aab[]" | grep '[bc]'
aab[]
$echo "aab[]" | grep '[cd]'
$echo "aab[]" | grep '[c\[]'
aab[]
$echo "aab[]" | grep '[c\]]'
$echo "aab[]" | grep '[c]]'
$


Pareil avec grep -E ...

Qu'est-ce que je fais mal? Savez vous comment il faudrait s'y prendre ?
Sinon c'est peut être faisable autrement qu'avec grep ?


Merci par avance
A voir également:

2 réponses

mamiemando Messages postés 33367 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 7 801
Modifié par mamiemando le 21/02/2012 à 20:15
C'est normal, '[' et ']' sont des méta-caractères au sens de grep (ce sont des opérateurs pour les expressions regulières, comme tu peux le voir dans "man grep). Ainsi, si tu veux parler du caractère [ ou ], il faut l'échapper avec le méta-caractère \.

(mando@aldur) (~) $ cat toto  
J'aime les tapirs 
[J] aime les loutre 

(mando@aldur) (~) $ grep '\[' toto  
[J] aime les loutre 

(mando@aldur) (~) $ grep '\]' toto  
[J] aime les loutre


Il y a d'autres méta-caractères, parmi lesquels : ?, *, +, ^, $ etc... Pour plus de détails :

man grep


Bonne chance
0
Merci, je savais ça, je les utilise justement comme montré dans mes exemples
Normalement $echo "aab[]" | grep '[c\]] devrait matcher soit c, soit \] qui est ] protégé.
Mais ça ne marche pas
0
Utilisateur anonyme
21 févr. 2012 à 23:18
salut,

si on place le crochet fermant en premier ça fonctionne
grep '[][c]'
mais je n'ai pas d'explication.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
22 févr. 2012 à 07:47
Salut,

mais je n'ai pas d'explication.
man grep :
To include a literal ] place  it  first  in  the  list.

;-))
0
Utilisateur anonyme
22 févr. 2012 à 11:26
ben, quoi ? Moi aussi, j'ai eu la flemme d'ouvrir la page man pour y chercher une explication. :/
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
22 févr. 2012 à 11:36
Bonjour quand même ;-\

Il n'y avait rien d'agressif dans mon intervention, juste la réponse à ton interrogation ;-))
0
mamiemando Messages postés 33367 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 7 801
Modifié par mamiemando le 22/02/2012 à 01:39
Pour [ comme tu l'as écrit il faut faire :

(mando@aldur) (~) $ echo "aab[]" | grep '[c\[]' 
aab[]


Pour inclure le caractère ] comme dit dans man grep :

Pour  inclure  un  caractère  ], mettez-le en premier dans la liste. De même, pour inclure un caractère ^, placez-le n'importe où sauf au début de la liste. Enfin, pour inclure un -, placez-le en dernier.


Ainsi l'expression régulière de qqchquicommenceparQ réagit dès qu'on trouve une occurrence de ], c et [. Pour réagir sur la classe de caractères { ']', 'c' } il faudrait par exemple écrire :

(mando@aldur) (~) $ echo "aabc]" | grep '[]c]' --color
aabc]


Pour t'en convaincre :

(mando@aldur) (~) $ echo "aabd]e" | grep 'd[]c]e' --color
aabd]e


Sinon, tu peux écrire :

(mando@aldur) (~) $ echo "aab[]" | grep '\(]\|c\)' 
aab[]


C'est un peu moche mais bon, au moins ça marche quand on ne connaît pas les conventions de grep ;-) Ici les parenthèse \( ... \) servent uniquement si tu es dans une expression régulière plus compliquée, sinon tu peux bien entendu les omettre :

(mando@aldur) (~) $ echo "aab[]" | grep ']\|c' 
aab[]


Bonne chance
0
Merci pour les explications détaillées! En mettant ']' en premier ça marche ! Et c'est bon à savoir aussi les cas particuliers de '^' et '-'.
0