it-swarm.asia

Bisakah GNU Grep menampilkan grup yang dipilih?

Apakah mungkin menggunakan GNU grep untuk mendapatkan grup yang cocok dari ekspresi?

Contoh:

echo "foo 'bar'" | grep -oE "'([^']+)'"

Yang akan menghasilkan "'bar'". Tetapi saya hanya ingin mendapatkan "bar", tanpa harus mengirimkannya melalui grep sekali lagi (mis. Dapatkan grup yang cocok). Apakah itu mungkin?

46
Torandi

Anda dapat menggunakan sed untuk ini. Pada BSD sed:

echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"

Atau, tanpa opsi -E:

sed "s/.*'\([^']\+\)'.*/\1/"

Ini tidak berfungsi untuk input multiline. Untuk itu Anda perlu:

sed -n "s/.*'\([^']\+\)'.*/\1/p"
49
jtbandes

Meskipun grep tidak dapat menampilkan grup tertentu, Anda dapat menggunakan lookahead dan di belakang pernyataan untuk mencapai apa yang Anda inginkan:

echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"

28
Aldrik

Anda dapat menggunakan \K untuk mengatur ulang dan membuang teks pertandingan tangan kiri bersama dengan lookahead yang tidak ditambahkan ke teks pertandingan:

$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar

Hanya GNU grep.

2
drewk