Utilisation de regex inside if clause dans bash


10

Regardez ce bloc si:

#!/bin/bash

str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
    echo "matched"
else
    echo "not matched"
    exit 1
fi

exit 0

Cela devrait imprimer "correspondant", mais ce n'est pas le cas. Où vais-je mal?

Réponses:


21

Vous devez supprimer la citation dans la correspondance d'expression régulière.

if [[ ${str} =~ m\.m ]]; then

Depuis la page de manuel de bash:

[...] Un opérateur binaire supplémentaire, = ~, est disponible, avec la même priorité que == et! =. Lorsqu'elle est utilisée, la chaîne à droite de l'opérateur est considérée comme une expression régulière étendue et correspond en conséquence (comme dans regex (3)). La valeur de retour est 0 si la chaîne correspond au modèle et 1 sinon. Si l'expression régulière est syntaxiquement incorrecte, la valeur de retour de l'expression conditionnelle est 2. Si l'option shell nocasematch est activée, la correspondance est effectuée sans tenir compte de la casse des caractères alphabétiques. N'importe quelle partie du modèle peut être citée pour forcer sa correspondance sous forme de chaîne.

Donc, avec les guillemets, vous utilisez une bonne correspondance de chaînes.

Si vous avez besoin d'espaces dans le motif, échappez-leur simplement:

str="m   m"
if [[ ${str} =~ m\ +m ]]; then

mais sans guillemet double, nous ne pouvons pas utiliser de caractère espace dans le motif regex. Y a-t-il une solution pour ça?
Majid Azimi

1
L'espace doit être échappé comme \ .
ДМИТРИЙ МАЛИКОВ

Si je veux trouver une chaîne qui se termine par un nombre dynamique, ${str} =~ "needle"[0-9]{1}dois-je utiliser ou dois-je utiliser ${str} =~ needle[0-9]{1}?
mgutt
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.