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?

Majid Azimi
la source

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
Tapis
la source
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