Bash/shell : tester présence caractères spéci
Résolu
Tranchoir
-
Utilisateur anonyme -
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
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:
- Bash/shell : tester présence caractères spéci
- Classic shell - Télécharger - Personnalisation
- Bingo bash - Télécharger - Divers Jeux
- Bash addition - Forum Shell
- Additionner deux réels en shell ✓ - Forum Shell
- Classic shell c'est quoi ✓ - Forum Windows 10
2 réponses
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 \.
Il y a d'autres méta-caractères, parmi lesquels : ?, *, +, ^, $ etc... Pour plus de détails :
Bonne chance
(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
Pour [ comme tu l'as écrit il faut faire :
Pour inclure le caractère ] comme dit dans man grep :
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 :
Pour t'en convaincre :
Sinon, tu peux écrire :
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 :
Bonne chance
(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
Normalement $echo "aab[]" | grep '[c\]] devrait matcher soit c, soit \] qui est ] protégé.
Mais ça ne marche pas
si on place le crochet fermant en premier ça fonctionne mais je n'ai pas d'explication.
mais je n'ai pas d'explication.
man grep :
;-))
Il n'y avait rien d'agressif dans mon intervention, juste la réponse à ton interrogation ;-))