it-swarm-es.tech

¿Puede GNU Grep generar un grupo seleccionado?

¿Es posible usar GNU grep para obtener un grupo coincidente de una expresión?

Ejemplo:

echo "foo 'bar'" | grep -oE "'([^']+)'"

Que daría salida a "'barra'". Pero me gustaría obtener solo "barra", sin tener que enviarlo a través de grep una vez más (es decir, obtener el grupo correspondiente). ¿Es eso posible?

46
Torandi

Puedes usar sed para esto. En BSD sed:

echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"

O, sin la opción -E:

sed "s/.*'\([^']\+\)'.*/\1/"

Esto no funciona para la entrada multilínea. Para eso necesitas:

sed -n "s/.*'\([^']\+\)'.*/\1/p"
49
jtbandes

Si bien grep no puede generar un grupo específico, puede usar aserciones de búsqueda anticipada y detrás para lograr lo que busca después:

echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"

28
Aldrik

Puede usar \K para restablecer y descartar el texto de coincidencia de la izquierda junto con un lookahead que no se agrega al texto de coincidencia:

$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar

Sólo GNU grep.

2
drewk