2011-02-16 27 views
5

Estoy tratando de tomar el último espacio y lo que sigue en una línea usando grep.Cómo tomar el último carácter en una expresión regular con grep

Esto me agarra el primer espacio:

echo "toto tata titi" | grep -o " .*$" 

En Java habría utilizado el operador no expansivo pero no parece funcionar:

echo "toto tata titi" | grep -o " .*?$" 

devolverlo nada

El resultado esperado es titi.

Respuesta

6

Reemplace . con [^ ], que coincide con todo menos el espacio. Entonces puede ser codicioso.

echo "toto tata titi" | grep -o " [^ ]*$" 

(Si desea grep de usar expresiones regulares extendidas, ya sea para uso egrep o grep -E.)

+0

Su expresión regular hace lo que yo quería hacer, gracias. ¿Pero sabes por qué los míos no funcionan incluso con -E? – JPB

+0

@ Jean-Philippe: Porque la expresión regular se aplica a la cadena del sujeto de izquierda a derecha, por lo que comienza en el primer espacio, se expande gradualmente hasta el final y, por lo tanto, tiene éxito. No es necesario probar otras posiciones. –

+0

@Jean: la coincidencia '/. *? $ /' Primero encuentra el espacio y comienza a emparejar desde allí. Sigue haciendo coincidir hasta el final de la cadena y está hecho. La no avaricia solo entra en juego cuando el intérprete tiene que decidir si continúa buscando la unidad actual ('.') o en su lugar con la siguiente. No retrocede hasta que encuentra la solución más corta. – Tim

1

EDIT: Acabo de ver una mejor respuesta a este mensaje, pero publicar esto de todos modos, ya que podría ser útil si quiere hacer algo más complejo, como sustituir cosas.

Otra forma de hacer esto como es utilizar el comando sed y dejar que se sustituye (con el comando s por primera vez en la expresión regular) todo excepto lo que desea (que se recoge en la variable \1 por los paréntesis:

echo "toto tata titi" | sed -r "s/.*(.*?)$/\1/" 
1

Básicamente, lo que está haciendo es sólo conseguir el primer carácter del último campo. el método más accesible que la expresión regular está utilizando una herramienta que puede dividir cadenas en los campos y hacer "subcadena-ing".

$ echo "toto tata titi" | awk '{print substr($NF,0,1)}' 
t 


$ echo "toto tata titi" | ruby -ane 'puts $F[-1][0]' 
t 
Cuestiones relacionadas