È possibile usare GNU grep per ottenere un gruppo abbinato da un'espressione?
Esempio:
echo "foo 'bar'" | grep -oE "'([^']+)'"
Quale produrrebbe "barra" ". Ma mi piacerebbe avere solo "bar", senza doverlo inviare attraverso grep ancora una volta (cioè ottenere il gruppo abbinato). È possibile?
Puoi usare sed
per questo. Su BSD sed
:
echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"
Oppure, senza l'opzione -E
:
sed "s/.*'\([^']\+\)'.*/\1/"
Questo non funziona per input multilinea. Per quello che ti serve:
sed -n "s/.*'\([^']\+\)'.*/\1/p"
Sebbene grep non possa emettere un gruppo specifico, puoi usare lookahead e dietro asserzioni per ottenere ciò che vuoi dopo:
echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"
Puoi utilizzare \K
per ripristinare e scartare il testo della corrispondenza della mano sinistra con un lookahead che non viene aggiunto al testo della corrispondenza:
$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar
Solo GNU grep.