Guarda questo se blocco:
#!/bin/bash
str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
exit 0
Questo dovrebbe stampare "abbinato", ma non lo fa. Dove sto sbagliando?
Guarda questo se blocco:
#!/bin/bash
str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
exit 0
Questo dovrebbe stampare "abbinato", ma non lo fa. Dove sto sbagliando?
Risposte:
Devi rimuovere il preventivo nella corrispondenza regex.
if [[ ${str} =~ m\.m ]]; then
Dalla pagina man di bash:
[...] È disponibile un ulteriore operatore binario, = ~, con la stessa precedenza di == e! =. Quando viene utilizzato, la stringa a destra dell'operatore viene considerata un'espressione regolare estesa e adattata di conseguenza (come in regex (3)). Il valore restituito è 0 se la stringa corrisponde al modello e 1 altrimenti. Se l'espressione regolare è sintatticamente errata, il valore restituito dell'espressione condizionale è 2. Se l'opzione shell nocasematch è abilitata, la corrispondenza viene eseguita indipendentemente dal caso dei caratteri alfabetici. Qualsiasi parte del motivo può essere quotata per forzare la corrispondenza con una stringa.
Quindi, con le virgolette, stai usando una corrispondenza di stringhe molto buona.
Se hai bisogno di spazi nel modello, sfuggili:
str="m m"
if [[ ${str} =~ m\ +m ]]; then
\
.
${str} =~ "needle"[0-9]{1}
o dovrei usare ${str} =~ needle[0-9]{1}
?