• Contenu
  • Bas de page
logo ouidoulogo ouidoulogo ouidoulogo ouidou
  • Qui sommes-nous ?
  • Offres
    • 💻 Applications métier
    • 🤝 Collaboration des équipes
    • 🛡️ Sécurisation et optimisation du système d’information
    • 🔗 Transformation numérique
  • Expertises
    • 🖥️ Développement logiciel
    • ♾️ DevSecOps
    • ⚙️ Intégration de logiciels et négoce de licences
      • Atlassian : Jira, Confluence, Bitbucket…
      • Plateforme monday.com
      • GitLab
      • SonarQube
    • 📚​ Logiciel de CRM et de gestion
    • 🎨 UX/UI design
    • 🌐 Accessibilité Numérique
    • 🗂️​ Démarches simplifiées
    • 📝 Formations Atlassian
  • Références
  • Carrières
    • 🧐 Pourquoi rejoindre Ouidou ?
    • ✍🏻 Nous rejoindre
    • 👨‍💻 Rencontrer nos collaborateurs
    • 🚀 Grandir chez Ouidou
  • RSE
  • Ressources
    • 🗞️ Actualités
    • 🔍 Articles techniques
    • 📖 Livres blancs
    • 🎙️ Interviews Clients
Nous contacter
✕
Le contexteLost in the ShellLet’s Read The Famous Manual !La solution
Ressources > Articles techniques > Regex, ZSH & Darwin

Regex, ZSH & Darwin

Article écrit par François Vantomme

Comme promis dans l’article portant sur les classes de caractères des regex, me revoilà avec, cette fois, un exemple concret que je vais exécuter froidement devant vous !

En passant d’un macOS à une Debian GNU/Linux, je me suis aperçu d’un comportement inattendu sur un script ZSH de ma confection en ce qui concerne les regex, et plus particulièrement les classes de caractères.

Le contexte

L’idée était de détecter la présence d’un mot dans une chaîne de caractères. Prenons la chaîne suivante en exemple :

bat exa fd fzf git htop ncdu neovim ripgrep tig tldr tmux tree watch z zplug 

Mettons maintenant que nous recherchions la présence du mot « tldr » dans cette liste. D’après ce que nous savons des classes de caractères, nous pouvons par exemple écrire la regex suivante :

/[[:<:]]tldr[[:>:]]/ 

Les classes de caractères [[:<:]] et [[:>:]] représentent respectivement le début et la fin d’un mot. Cela nous permet de nous assurer de ne pas tomber sur une suite de caractères au milieu d’un mot. On peut ainsi rechercher « z » sans tomber sur « fzf » ou « zplug », pour reprendre notre exemple.

Lost in the Shell

Voyons à présent ce que cela donne quand on utilise notre petite regex dans le contexte de ZSH.

❯ uname Darwin ❯ [[ "bat tldr zplug" =~ [[:<:]]man[[:>:]] ]] && echo "true" || echo "false" false ❯ [[ "bat tldr zplug" =~ [[:<:]]tldr[[:>:]] ]] && echo "true" || echo "false" true 

Tout semble se passer pour le mieux ! Essayons sous GNU/Linux :

❯ uname Linux ❯ [[ "bat tldr zplug" =~ [[:<:]]tldr[[:>:]] ]] && echo "true" || echo "false" zsh: failed to compile regex: Nom de classe de caractères invalide false 

Outch ! Mais que se passe-t-il ?

Let’s Read The Famous Manual !

Un petit tour dans la documentation de ZSH devrait nous aiguiller… voyons voir.

REMATCH_PCRE        If set, regular expression matching with the =~ operator will use        Perl-Compatible Regular Expressions from the PCRE library. (The zsh/pcre        module must be available.) If not set, regular expressions will use the        extended regexp syntax provided by the system libraries. 

Il semblerait qu’une option nous permettrait d’imposer une bibliothèque compatible Perl (PCRE). Si cette option n’est pas définie, nous sommes dépendants de la bibliothèque système. Allons-y !

❯ uname Darwin ❯ setopt rematch_pcre ❯ [[ "bat tldr zplug" =~ [[:<:]]man[[:>:]] ]] && echo "true" || echo "false" false ❯ [[ "bat tldr zplug" =~ [[:<:]]tldr[[:>:]] ]] && echo "true" || echo "false" true  ❯ unsetopt rematch_pcre ❯ [[ "bat tldr zplug" =~ [[:<:]]tldr[[:>:]] ]] && echo "true" || echo "false" true 
❯ uname Linux ❯ setopt rematch_pcre ❯ [[ "bat tldr zplug" =~ [[:<:]]man[[:>:]] ]] && echo "true" || echo "false" false ❯ [[ "bat tldr zplug" =~ [[:<:]]tldr[[:>:]] ]] && echo "true" || echo "false" true  ❯ unsetopt rematch_pcre ❯ [[ "bat tldr zplug" =~ [[:<:]]tldr[[:>:]] ]] && echo "true" || echo "false" zsh: failed to compile regex: Nom de classe de caractères invalide false 

Parfait, ça semble faire le boulot ! Cela dit, si nous nous rappelons bien du tableau présenté dans l’article précédent, il existe d’autres manières de délimiter un mot :

❯ uname Linux ❯ unsetopt rematch_pcre ❯ [[ "bat tldr zplug" =~ "<tldr>" ]] && echo "true" || echo "false" true ❯ [[ "bat tldr zplug" =~ "btldrb" ]] && echo "true" || echo "false" true 

Mais là, manque de chance, c’est macOS qui flanche :

❯ uname Darwin ❯ unsetopt rematch_pcre ❯ [[ "bat tldr zplug" =~ "btldrb" ]] && echo "true" || echo "false" false ❯ [[ "bat tldr zplug" =~ "<tldr>" ]] && echo "true" || echo "false" false 

La solution

À la vue de ces comportements bigarrés, la meilleure option qui s’offre à nous est de nous assurer qu’un moteur PCRE sera utilisé, ou d’utiliser une regex de repli dans le cas contraire. Ce qui pourrait donner ceci :

if [[ -o rematchpcre || "$OSTYPE" == darwin* ]]; then   [[ "bat tldr zplug" =~ [[:<:]]tldr[[:>:]] ]] else   [[ "bat tldr zplug" =~ "<tldr>" ]] fi 

On considère ici que si l’option ZSH rematchpcre est activée ou si le système d’exploitation est macOS (darwin de son petit nom), alors on pourra utiliser notre regex compatible Perl.

En espérant que ce petit retour d’expérience vous aura appris une ou deux choses et donné l’envie de lire le fameux manuel quand une question vous taraude !

À lire aussi

Fresque numérique miniature image
16 avril 2025

Fresque du Numérique

Lire la suite

intelligence artificielle Ouicommit miniature image
17 mars 2025

Ouicommit – L’intelligence artificielle en entreprise, on y est ! 

Lire la suite

Image miniature Hackathon Women in Tech
13 mars 2025

Hackathon Women in Tech :  un engagement pour une tech plus inclusive 

Lire la suite

image miniature les nouveautés Atlassian
26 février 2025

Les nouveautés Atlassian en 2025

Lire la suite

Articles associés

Fresque numérique miniature image
16 avril 2025

Fresque du Numérique


Lire la suite
intelligence artificielle Ouicommit miniature image
17 mars 2025

Ouicommit – L’intelligence artificielle en entreprise, on y est ! 


Lire la suite
Image miniature Hackathon Women in Tech
13 mars 2025

Hackathon Women in Tech :  un engagement pour une tech plus inclusive 


Lire la suite

À propos

  • Qui sommes-nous ?
  • Références
  • RSE
  • Ressources

Offres

  • Applications métier
  • Collaboration des équipes
  • Sécurisation et optimisation du système d’information
  • Transformation numérique

Expertises

  • Développement logiciel
  • DevSecOps
  • Intégration de logiciels et négoce de licences
  • Logiciel de CRM et de gestion
  • UX/UI design
  • Accessibilité Numérique
  • Démarches simplifiées
  • Formations Atlassian

Carrières

  • Pourquoi rejoindre Ouidou ?
  • Nous rejoindre
  • Rencontrer nos collaborateurs
  • Grandir chez Ouidou

SIEGE SOCIAL
70-74 boulevard Garibaldi, 75015 Paris

Ouidou Nord
165 Avenue de Bretagne, 59000 Lille

Ouidou Rhône-Alpes
4 place Amédée Bonnet, 69002 Lyon

Ouidou Grand-Ouest
2 rue Crucy, 44000 Nantes

Ouidou Grand-Est
7 cour des Cigarières, 67000 Strasbourg

  • Linkedin Ouidou
  • GitHub Ouidou
  • Youtube Ouidou
© 2024 Ouidou | Tous droits réservés | Plan du site | Mentions légales | Déclaration d'accessibilité
    Nous contacter
      preload imagepreload image
      La Programmation Réactive
      La Programmation Réactive
      15 novembre 2021
      Test d’API & chaining request
      Test d’API & chaining request
      26 novembre 2021