2011-05-01 24 views
19

tengo unas pocas cosas¿Por qué no funciona esta prueba de expresión regular?

echo $line 
Thisisaline. 

Me preguntaba por qué esto no está trabajando:

if [[ "$line" =~ "[a-zA-Z]+\.$" ]] ; then echo "hello"; fi 

Por encima de expresiones regulares da ninguna salida.

+0

Su patrón de expresión regular no permite espacios, ¿o sí? –

+0

No, modifiqué la cadena de coincidencia. – abc

Respuesta

2

Alguna versión del sistema operativo con bash le da la salida. Depende de usted obtener sus actualizaciones. Sin embargo, sin expresiones regulares que usted puede utilizar englobamiento extendido

shopt -s extglob 
case "$line" in 
+([a-zA-Z]).) echo "hello";; 
esac 

si no, utilizar expresiones regulares sin las comillas

+0

Sí +1, son las comillas .. No son necesarias, y más aún, no deberían usarse aquí (a menos que intente hacer coincidir una cita, por lo que si desea un espacio en su patrón, debe escapar de él, ' \ '(hay un espacio después de \ ... También tenga en cuenta que para hacer coincidir toda la línea como alfabética, debe agregar un '' 'y un' $ 'posterior, de lo contrario coincidirá con' 123 456 abc. cat y mouse' –

+0

@fred, vale, así que debes poner eso como una respuesta para que OP pueda saberlo :) – ghostdog74

14

Trate

if [[ $line =~ [a-zA-Z]+\. ]] ; then echo hello; fi 
27

El problema es que usted está utilizando cotizaciones ...

En bash regex, no hay necesidad de cotizaciones, y más aún, no deben usarse (a menos que intente hacer coincidir una cotización (en cuyo caso puede escapar de ella \") ... Además, si quieres un espacio en su patrón, debe escapar de ella, (hay un espacio después de la barra invertida ...

También tenga en cuenta, que para que coincida con la línea completa de ser alfabético , debe agregar un ^ y un $ posterior, de lo contrario coincidirá con las siguientes líneas: 123 456 abc. cat and mouse

Cuestiones relacionadas