GNU/Linux >> Belajar Linux >  >> Linux

Ekstrak Substring Menurut Regexp Dengan Sed Atau Grep?

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.


Linux
  1. Tambahan Dengan 'sed'?

  2. Linux – Menemukan Substring Dalam File di Seluruh Subdirektori Dengan Satu Perintah Bawaan?

  3. Bagaimana cara mengganti karakter dengan sed secara rekursif?

  1. Menemukan substring dalam file di seluruh subdirektori dengan satu perintah bawaan?

  2. Isi nol angka menjadi 2 digit dengan sed

  3. Ekspresi reguler dengan sed

  1. Grep Dengan Operator Logika?

  2. Menghapus Semua Komentar C Dengan Sed?

  3. Cara grep keluaran ps dengan header