2014-04-15 19 views
5

Chcę dopasować linię, która zawiera słowa, ale nie ma średnika w todopasować linię za pomocą bash regex

ten powinien mecz:

class test 

ten nie powinien pasować

class test; 

ten nie powinien pasować zarówno

class test; // test class 

to, co spodziewałem się do pracy, ale nie:

pattern="class [^;]*" 

if [[ $line =~ $pattern ]] 

dzięki

+1

Co z 'testem klasy // klasa testowa;'? –

+0

Nie edytuj tego pytania, podając nowe pytanie lub usuń informacje z tego pytania, które zawiera odpowiedzi. Użyj przycisku [Zadaj pytanie] (http://stackoverflow.com/questions/ask) i opublikuj nowe pytanie z [wszystkimi szczegółami potrzebnymi do uzyskania odpowiedzi] (http://stackoverflow.com/help/how- to-ask) – Taryn

Odpowiedz

0

Wpisz ^[^;]+($|\s*//). Oznacza to dowolną liczbę znaków nie-średnikowych (przynajmniej jeden) od początku ciągu znaków aż do końca linii lub dowolnej liczby spacji, po której następują dwa ukośniki.

http://rubular.com/r/HTizIXz2HA

0

myślę, że trzeba:

pattern="^[^;]*class [^;]*$"` 

Zapewnia to linia nie masz; przed lub po dopasowaniu [^;]*.

1

jak o wprost:

pattern="^[^;]*\bclass\b[^;]*$" 

\b słowa granica dodano do dopasowania xxx class xxx tylko, nie pasujące superclass xxx

3

wyrażenie regularne nie jest anchored co oznacza, że ​​[^;]* będzie nadal pasuje na wszystkich znaków w górę do możliwego ; (a więc dopasować jako całość). Jeśli zakotwiczyć regex przed końcem linii ([^;]*$) będzie produkować wyniki szukasz:

$ cat t.sh 
#!/bin/bash 

pattern='class [^;]*$' 
while read -r line; do 
    printf "testing '${line}': " 
    [[ $line =~ $pattern ]] && echo matches || echo "doesn't match" 
done <<EOT 
class test 
class test; 
class test; // test class 
EOT 

$ ./t.sh 
testing 'class test': matches 
testing 'class test;': doesn't match 
testing 'class test; // test class': doesn't match 

TL; DR: Innymi słowy, pogrubione części w

test lekcyjny; foo bar quux

dopasowuje twoje wyrażenie regularne, mimo że ciąg zawiera średnik, dlatego zawsze pasuje. Zakotwiczenie zapewnia, że ​​wyrażenie regularne pasuje tylko wtedy, gdy nie ma średnika aż do samego końca ciągu znaków.

+0

Działa to świetnie, bardzo dziękuję – ewrgq3er

Powiązane problemy