J'utilise la même expression rationnelle avec grep
et cela me donne une correspondance, mais lorsque vous le faites dans un script bash, elle ne renvoie aucune correspondance.
Chaîne de test (partie du fichier _testregex.txt
_):
_<a href="/os_x_lynx-wallpapers.html"><p>OS X Lynx</p>
_<img src="/thumbs/os_x_lynx-t1.jpg"
_alt="OS X Lynx" class="thumb_img" width="270" height="169"/></a></div><div style="float:right;margin-right:13px;"></div></div>
_
Cette commande correspond correctement à la partie en surbrillance (et à quelques autres):
_grep -E '<img src="[^"]*\.jpg"' testregex.txt
_
Mais ce script bash ne renvoie aucune correspondance:
_page=$(<testregex.txt)
if [[ $page =~ '<img src="[^"]*\.jpg"' ]]; then
echo $1
echo "match found"
else
echo "match not found!"
fi
_
Dans le cas, l'opérateur =~
, n'utilisez pas de guillemets pour l'opérateur de droite. Ceci est considéré comme une expression régulière étendue, de sorte que dans ce cas, les guillemets simples feront partie de l’expression régulière. Ainsi, en utilisant des guillemets simples, une chaîne comme '<img src="/thumbs/os_x_lynx-t1.jpg"'
(qui contient également des guillemets simples autour de celle-ci) sera trouvée. Voir Signification de l'opérateur “= ~” dans le script Shell .
En outre, vous devez échapper à tout caractère spécial de votre expression rationnelle (guillemets, espaces, redirection de shell - <
):
#!/bin/bash
page=$(<testregex.txt)
if [[ $page =~ \<img\ src=\"[^\"]*\.jpg\" ]]; then
echo $1
echo "match found"
else
echo "match not found!"
fi
En dehors de =~
, vous pouvez utiliser dans votre script votre commande originale qui utilise grep
:
#!/bin/bash
if grep -qE '<img src="[^"]*\.jpg"' testregex.txt ; then
echo $1
echo "match found"
else
echo "match not found!"
fi
Dans ce cas, j’ai utilisé l’option -q
pour grep
ne rien écrire sur la sortie standard et quitter immédiatement si aucune correspondance n’est trouvée.
Si vous écrivez [[ "$page" =~ '<img src="[^"]*\.jpg"' ]]
, alors le membre de droite sera traité comme une chaîne ordinaire et non comme une regex. Voir instruction Bash regex . La solution consiste à échapper à tous les caractères spéciaux .
sinon, vous pouvez utiliser l'instruction regex dans une variable séparée entre guillemets simples ''
comme,
var='<img src="[^"]*\.jpg'
dans ce cas, vous n'avez pas besoin d'échapper des caractères spéciaux un par un.
#!/bin/bash
page=$(<testregex.txt)
var='<img src="[^"]*\.jpg'
if [[ "$page" =~ $var ]]; then
# echo $1
echo "match found"
else
echo "match not found!"
fi
J'ai commenté la déclaration echo $1
. Différence entre guillemets simples et doubles entre bash .