Jak używać wyrażeń regularnych w skryptach bash?


83

Chcę sprawdzić, czy zmienna ma prawidłowy rok, używając wyrażenia regularnego. Czytając instrukcję basha , rozumiem, że mogę użyć operatora = ~

Patrząc na poniższy przykład, spodziewałbym się komunikatu „nie OK”, ale widzę „OK”. Co ja robię źle?

i="test"
if [ $i=~"200[78]" ]
then
  echo "OK"
else
  echo "not OK"
fi


Zauważ, że to nie powiodło się z powodu braku przestrzeni wokół =~.
fedorqui 'SO przestań szkodzić'

Odpowiedzi:


116

Został zmieniony między 3.1 a 3.2:

To jest zwięzły opis nowych funkcji dodanych do bash-3.2 od czasu wydania bash-3.1.

Cytowanie argumentu łańcucha dla operatora [[command's = ~] wymusza teraz dopasowanie łańcucha, tak jak w przypadku innych operatorów dopasowywania wzorców.

Więc użyj go bez cudzysłowów w ten sposób:

i="test"
if [[ $i =~ 200[78] ]] ; then
    echo "OK"
else
    echo "not OK"
fi

1
Jak poradzić sobie z sytuacją, gdy wyrażenie regularne zawiera spacje, jeśli nie mogę cytować? Jeśli wyrażenie regularne to np a +b.
Zgłosi

5
@Alderath: służy a\ \+bdo usuwania spacji i znaku plus.
blinry

8

Potrzebujesz spacji wokół operatora = ~

i = "test"
if [[$ i = ~ "200 [78]"]];
następnie
  echo „OK”
jeszcze
  echo „nie OK”
fi

3
Odpowiedź paxdiablo jest prawidłowa, dodawanie spacji tutaj nie pomaga (teraz otrzymujesz również „nie OK” dla 2008, jedyny ciąg, który jest dopasowywany to dosłownie „200 [78]”).
Marcel Stimberg
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.