¿Es posible usar GNU grep para obtener un grupo coincidente de una expresión?
Ejemplo:
echo "foo 'bar'" | grep -oE "'([^']+)'"
Lo que generaría "'bar'". Pero me gustaría obtener solo "bar", sin tener que enviarlo a través de grep una vez más (es decir, obtener el grupo coincidente). ¿Es eso posible?
( ) +
usar\( \) \+
: Esto es efectivamente lo mismo:sed "s/.*'\([^']\+\)'.*/\1/"
sed -n "s/.*'\([^']\+\)'.*/\1/p"
Si bien grep no puede generar un grupo específico, puede usar aserciones anticipadas y subyacentes para lograr lo que busca:
fuente
grep -P
no está disponible en todas las plataformas. Pero si es así, usar mirar hacia adelante / atrás es una muy buena manera de resolver el problema.Puede usar
\K
para restablecer y descartar el texto de coincidencia de la izquierda junto con una búsqueda anticipada que no se agrega al texto de coincidencia:GNU grep solamente.
fuente