¿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?
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"
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 "(?<=')[^']+(?=')"
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.