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.