2014-04-15 13 views
5

voglio corrispondere a una riga che contiene una parola, ma non ha punto e virgola in essoabbinare una linea utilizzando bash regex

Questo dovrebbe corrispondere:

class test 

questo non dovrebbe corrispondere

class test; 

questo non dovrebbe corrispondere né

class test; // test class 

questo è quello che mi aspettavo di lavorare, ma non è così:

pattern="class [^;]*" 

if [[ $line =~ $pattern ]] 

grazie

+1

E per quanto riguarda 'class test // test class;'? –

+0

Non modificare questa domanda con la tua nuova domanda o rimuovere i dettagli da questa domanda che ha le risposte. Utilizza il pulsante [Chiedi domanda] (http://stackoverflow.com/questions/ask) e posta una nuova domanda fornendo [tutti i dettagli necessari per ottenere la tua risposta] (http://stackoverflow.com/help/how- chiedere) – Taryn

risposta

0

Utilizzare ^[^;]+($|\s*//). Questo significa qualsiasi numero di caratteri non-punto e virgola (almeno uno) dall'inizio della stringa fino alla fine della riga o qualsiasi numero di spazi seguito da due barre.

http://rubular.com/r/HTizIXz2HA

0

Penso che avete bisogno:

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

Questo assicura la linea non hanno una; prima o dopo la partita [^;]*.

1

come circa semplicemente:

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

\b parola è stato aggiunto confine, per la corrispondenza xxx class xxx solo, che non corrisponde superclass xxx

3

tua espressione regolare non è anchored il che significa che [^;]* sarà ancora corrispondere contro tutti i caratteri fino a un possibile ; (e quindi corrisponde nel suo insieme). Se si ancora l'espressione regolare contro l'estremità della linea ([^;]*$) che produrrà i risultati che stai cercando:

$ 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: In altre parole, la parte in grassetto in

prova di classe; foo bar quux

corrisponde alla tua espressione regolare anche se la stringa contiene un punto e virgola, motivo per cui corrisponde sempre. L'ancora si assicura che l'espressione regolare corrisponda solo se non c'è punto e virgola fino alla fine della stringa.

+0

Funziona alla grande, grazie mille – ewrgq3er

Problemi correlati