it-swarm-eu.dev

Can GNU Grep emette un gruppo selezionato?

È 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?

46
Torandi

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"
49
jtbandes

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

28
Aldrik

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.

2
drewk