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
idrosid
źródło
możliwy duplikat bash regex z cudzysłowami?
outis
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
paxdiablo
źródło
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
michiel
źródło
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