Puedes usar sed
para esto. En BSD sed
:
echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"
O, sin el -E
opción:
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 anticipadas y subyacentes para lograr lo que busca:
echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"
Puedes 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:
$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar
GNU grep solamente.