Dalam lingkungan UNIX (BSD), saya ingin menangkap substring tertentu menggunakan ekspresi reguler.
Asumsikan bahwa dmesg
keluaran perintah akan menyertakan baris berikut:
pass2: <Marvell Console 1.01> Removable Processor SCSI device
Saya ingin menangkap teks di antara <
dan >
karakter, seperti
dmesg | <sed command>
seharusnya menampilkan:
Marvell Console 1.01
Namun, seharusnya tidak menampilkan apa pun jika regex tidak cocok. Banyak solusi termasuk sed -e 's/$regex/1/
akan menampilkan seluruh input jika tidak ada yang cocok, yang bukan yang saya inginkan.
Regexp yang sesuai dapat berupa:regex="^pass2: <(.*)>"
Bagaimana saya melakukan pencocokan regex dengan benar menggunakan sed
atau grep
? Perhatikan bahwa grep -P
opsi tidak tersedia di distribusi UNIX BSD saya. sed -E
pilihan tersedia, namun.
Jawaban yang Diterima:
Coba ini,
sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Atau POSIXly (-E
belum mencapai standar POSIX pada 2019):
sed -n 's/^pass2:.*<(.*)>.*$/1/p'
Keluaran:
$ printf '%sn' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Marvell Console 1.01
Ini hanya akan mencetak kemunculan terakhir <...>
untuk setiap baris.