2009-10-21 6 views
13

Jak mam zrobić dopasowanie do wyrażenia regularnego, jak pokazano poniżej, ale z cytatami wokół ("^ To"), tak jak w prawdziwym świecie "To" będzie ciąg, który może zawierać spacje.Regex dopasowuje ciąg znaków ze spacjami (należy używać cudzysłowów?) W instrukcji if

#!/bin/bash 

text="This is just a test string" 
if [[ "$text" =~ ^This ]]; then 
echo "matched" 

else 
echo "not matched" 
fi 

chcę zrobić coś jak

if [[ "$text" =~ "^This is" ]]; then 

ale to nie pasuje.

Odpowiedz

20

Można użyć \ przed przestrzeniach.

#!/bin/bash 

text="This is just a test string" 
if [[ "$text" =~ ^This\ is\ just ]]; then 
    echo "matched" 
else 
    echo "not matched" 
fi 
+0

+1 Jest to z pewnością sposób, aby to zrobić. Przedrostki bash używane z '= ~' powinny najczęściej (zawsze?) Być niecytowane. –

+0

Dobrze to słyszeć. Nigdy wcześniej nie używałem wyrażeń regularnych bash, po prostu eksperymentowałem i odkryłem, że \ działało. * Na S.O., jest to poprawne, dopóki nie udowodniono, że jest źle! * –

+0

FWIW, zmieniło się to pomiędzy Bash 3.1 a Bash 3.2. Bash 4.0 ma konfigurowalny 'shopt -s/-u compat31' do przełączania pomiędzy zachowaniami. – ephemient

-2

Czy próbowałeś:

^[\s]*This 
-1

Czy możesz poprawić swój opis problemu?

text="This is just a test string" 
case "$text" in 
    "This is"*) echo "match";; 
esac 

Powyższe założenie zakłada dopasowanie "To jest" na dokładnie początku linii.

0

Nie udało się wbudować ekspresję takiego:

if [[ "$text" =~ "^ *This " ]]; then 

ale jeśli umieścić wyrażenie w zmiennej można użyć normalnej regex składnię tak:

pat="^ *This " 
if [[ $text =~ $pat ]]; then 

pamiętać, że zacytowanie na $text i $pat jest niepowiązane.

Edit: wygodnym oneliner trakcie opracowywania:

pat="^ *This is "; [[ " This is just a test string" =~ $pat ]]; echo $? 
+0

Nie ma spacji na początku '$ text', więc' $ pat' powinno być '"^To "'. Również przytoczenie zmiennych tutaj jest nie tylko niepotrzebne, ale nie zadziała. +1 za pokazanie formatu zmiennego. –

Powiązane problemy