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

Résolu
Tranchoir -  
 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

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
    1. Tranchoir
       
      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
    2. Utilisateur anonyme
       
      salut,

      si on place le crochet fermant en premier ça fonctionne
      grep '[][c]'
      mais je n'ai pas d'explication.
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

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

      ;-))
      0
    4. Utilisateur anonyme
       
      ben, quoi ? Moi aussi, j'ai eu la flemme d'ouvrir la page man pour y chercher une explication. :/
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Bonjour quand même ;-\

      Il n'y avait rien d'agressif dans mon intervention, juste la réponse à ton interrogation ;-))
      0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
    1. Tranchoir
       
      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