Saya ingin mengambil dua angka terakhir (satu int, satu float; diikuti oleh spasi opsional) dan hanya mencetaknya.
Contoh:
foo bar <foo> bla 1 2 3.4
Harus mencetak:
2 3.4
Sejauh ini, saya memiliki yang berikut:
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/replacement/p'
akan memberi saya
foo bar <foo> bla 1 replacement
Namun, jika saya mencoba menggantinya dengan grup 1, seluruh baris dicetak.
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/\1/p'
Bagaimana saya bisa mencetak hanya bagian dari garis yang cocok dengan regex di grup?
-r
atau `--regexp-extended` jika tidak saya mendapatkaninvalid reference \1 on
error RHS` s's command.(
dan)
bukannya\(
dan\)
..*
ke akhir regexp jika string yang ingin Anda ekstrak tidak selalu di akhir baris..*
serakah dan sed tidak memiliki yang tidak serakah.*?
(
dan)
tidak akan menimbulkan kesalahan di ubuntu 16.04. Jadi saya pikir komentar ini sudah ketinggalan zaman.grep adalah alat yang tepat untuk mengekstraksi.
menggunakan contoh dan regex Anda:
sumber
grep -o
panggilan telepon. stackoverflow.com/a/58314379/117471Dan untuk pilihan lain, saya akan pergi dengan awk!
Ini akan membagi input (saya menggunakan STDIN di sini, tetapi input Anda dapat dengan mudah menjadi file) pada spasi, dan kemudian mencetak bidang terakhir tapi satu, dan kemudian bidang terakhir. The
$NF
variabel memegang sejumlah bidang ditemukan setelah meledak di ruang.Manfaat dari ini adalah bahwa tidak masalah jika apa yang mendahului dua bidang terakhir berubah, selama Anda hanya ingin dua bidang terakhir itu akan terus berfungsi.
sumber
Perintah cut dirancang untuk situasi yang tepat ini. Ini akan "memotong" pada pembatas apa pun dan kemudian Anda dapat menentukan potongan mana yang harus di-output.
Misalnya:
echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7
Akan menghasilkan output dari:
2 3.4
-d mengatur pembatas
-f memilih rentang 'bidang' ke output, dalam hal ini, ini adalah potongan ke 6 sampai 7 dari string asli. Anda juga dapat menentukan rentang sebagai daftar, seperti
6,7
.sumber
awk '{ print $2" "$6 }'
cut -d " " -f 2,6
Saya setuju dengan @kent bahwa ini cocok untuk
grep -o
. Jika Anda perlu mengekstrak grup dalam suatu pola, Anda dapat melakukannya dengan grep ke-2.sumber