Używanie wyrażenia regularnego wewnątrz klauzuli if w bash


10

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:


21

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

ale bez podwójnego cudzysłowu nie możemy używać znaku spacji we wzorze wyrażenia regularnego. Czy jest na to jakieś rozwiązanie?
Majid Azimi,

1
Przestrzeń powinna być jak ucieczka \ .
ДМИТРИЙ МАЛИКОВ

Jeśli chcę znaleźć ciąg, który kończy się liczbą dynamiczną, powinienem go użyć, ${str} =~ "needle"[0-9]{1}czy powinienem ${str} =~ needle[0-9]{1}?
mgutt
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.