2013-06-10 13 views
22

Witaj, wspaniała społeczność,Wyrażenie regularne w skrypcie Bash

Jestem kompletnym dopingiem jeśli chodzi o wyrażenie regularne. Odkładałem naukę ... a teraz moje lenistwo mnie dogoni.

Co usiłuję zrobić:
sprawdzić, czy ciąg pasuje do tej format:

10_06_13 

tj. Dzisiejsza data lub podobny termin z „2digits_2digits_2digits”

Co robiłem:

regex='([0-9][0-9][_][0-9][0-9][_][0-9][0-9])' 
if [[ "$incoming_string" =~ $regex ]] 
then 
    # Do awesome stuff here 
fi 

Działa to do pewnego stopnia. Ale gdy przychodzący łańcuch jest równy 011_100_131 ... nadal przechodzi kontrolę regex.

Byłbym wdzięczny, gdyby ktoś mógł wskazać mi właściwy kierunek.
Cheers

+1

Uwaga: podkreślenia nie muszą być w nawiasach kwadratowych. "_" pasuje do tego samego, co '[_]'. – chepner

+2

011_100_131 nie pasuje do Twojego wyrażenia regularnego. 011_10_131 zrobiłby. – hop

Odpowiedz

35

=~ powiedzie się, jeśli ciąg na lewym zawiera mecz dla regex po prawej stronie. Jeśli chcesz wiedzieć, czy ciąg mecze regex, trzeba „kotwica” regex po obu stronach, tak:

regex='^[0-9][0-9][_][0-9][0-9][_][0-9][0-9]$' 
if [[ $incoming_string =~ $regex ]] 
then 
    # Do awesome stuff here 
fi 

^ powiedzie się tylko na początku łańcucha, a $ tylko kończy się sukcesem.

Uwagi:

  1. usunąłem niepotrzebne () z regex i "" z [[ ... ]].
  2. Instrukcja bash jest źle sformułowana, ponieważ mówi, że =~ powiedzie się, jeśli ciąg się zgadza.
+0

Cholera, byłem tak blisko! Przypuszczałem, że "^" to wykluczanie postaci. Dziękuję Ci bardzo! :) – Robbie

+7

@Robbie: '^' oznacza "wykluczając", gdy jest pierwszą rzeczą w zestawie znaków ('[...]'), a to oznacza "zakotwiczone", gdy jest pierwszą rzeczą we wzorcu. W przeciwnym razie po prostu pasuje do '^' (ale nie jest to prawdą we wszystkich implementacjach regex, czasami oznacza to "dopasuj początek linii"). Zgadzam się, że jest to mylące, dopóki się do tego nie przyzwyczaisz. – rici

+0

Świetnie! Bardzo pomocna, jeszcze raz dziękuję. Zasłużenie w głosowaniu! – Robbie