Spójrz na to, jeśli blok:
#!/bin/bash
str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
exit 0
To powinno wypisać „dopasowane”, ale tak nie jest. Gdzie się mylę?
Spójrz na to, jeśli blok:
#!/bin/bash
str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
exit 0
To powinno wypisać „dopasowane”, ale tak nie jest. Gdzie się mylę?
Odpowiedzi:
Musisz usunąć cytowanie w dopasowaniu wyrażenia regularnego.
if [[ ${str} =~ m\.m ]]; then
Ze strony podręcznika użytkownika bash:
[...] Dostępny jest dodatkowy operator binarny = = ~, z takim samym pierwszeństwem jak == i! =. Gdy jest używany, łańcuch po prawej stronie operatora jest uważany za rozszerzone wyrażenie regularne i odpowiednio dopasowywany (jak w wyrażeniu regularnym (3)). Zwracana wartość to 0, jeśli łańcuch pasuje do wzorca, a 1 w przeciwnym razie. Jeśli wyrażenie regularne jest niepoprawne pod względem składniowym, zwracana jest wartość wyrażenia warunkowego 2. Jeśli włączona jest opcja powłoki nocasematch, dopasowanie jest wykonywane bez względu na wielkość liter. Każda część wzorca może być cytowana, aby wymusić dopasowanie go jako łańcucha.
Więc w cudzysłowach używasz starego dobrego dopasowania ciągów.
Jeśli potrzebujesz spacji we wzorze, po prostu uciec z nich:
str="m m"
if [[ ${str} =~ m\ +m ]]; then
\
.
${str} =~ "needle"[0-9]{1}
czy powinienem ${str} =~ needle[0-9]{1}
?