Bash/shell : tester présence caractères spéci [Résolu/Fermé]

Signaler
-
 Utilisateur anonyme -
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

2 réponses

Messages postés
29413
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
11 novembre 2020
6 964
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
Utilisateur anonyme
salut,

si on place le crochet fermant en premier ça fonctionne
grep '[][c]'
mais je n'ai pas d'explication.
Messages postés
35766
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
13 novembre 2020
5 629
Salut,

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

;-))
Utilisateur anonyme
ben, quoi ? Moi aussi, j'ai eu la flemme d'ouvrir la page man pour y chercher une explication. :/
Messages postés
35766
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
13 novembre 2020
5 629
Bonjour quand même ;-\

Il n'y avait rien d'agressif dans mon intervention, juste la réponse à ton interrogation ;-))
Utilisateur anonyme
«Il n'y avait rien d'agressif dans mon intervention»
pareil !

bonne journée à toi aussi :)
Messages postés
29413
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
11 novembre 2020
6 964
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
Merci pour les explications détaillées! En mettant ']' en premier ça marche ! Et c'est bon à savoir aussi les cas particuliers de '^' et '-'.