Bagaimana cara membuat sed
garis pencocokan filter menurut beberapa ekspresi, tetapi mengabaikan garis yang tidak cocok, alih-alih membiarkannya dicetak?
Sebagai contoh nyata, saya ingin menjalankan scalac
(kompiler Scala) pada satu set file, dan membaca dari -verbose
outputnya .class
file yang dibuat. scalac -verbose
mengeluarkan banyak pesan, tetapi kami hanya tertarik pada yang berbentuk [wrote some-class-name.class]
. Apa yang saat ini saya lakukan adalah ini ( |&
adalah cara bash 4.0 untuk menyalurkan stderr ke program berikutnya):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Ini akan mengekstrak nama file dari pesan yang kami minati, tetapi juga akan membiarkan semua pesan lain lewat tanpa diubah! Tentu saja kita bisa melakukan ini:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
yang berfungsi tetapi terlihat sangat mirip dengan masalah sebenarnya, yaitu bagaimana menginstruksikan sed
untuk mengabaikan baris yang tidak cocok dari input. Jadi bagaimana kita melakukannya?
Jawaban:
Cara lain dengan sed biasa:
s///
adalah substituion,t
tanpa label apa pun secara kondisional melewatkan semua perintah berikut,d
menghapus baris.Tidak perlu perl atau grep.
(diedit setelah saran Nicholas Riley)
sumber
tx
dand
dengan baris baru daripada titik koma seperti yang saya dapatkanundefined label 'x;d;:x'
.sed -e 's/.../.../' -e 'tx' -e 'd' -e ':x'
(disarankan dalam komentar pada pertanyaan serupa ).sed -e 's/.../.../' -e 't' -e 'd'
.-e
opsi jadi jangan menyebutkannya secara umum.Jika Anda tidak ingin mencetak garis yang tidak cocok, Anda dapat menggunakan kombinasi
-n
opsi yang memberi tahu sed untuk tidak mencetakp
bendera yang memberitahu sed untuk mencetak apa yang cocokIni memberi:
sumber
echo foo | sed -n -e 's/foo/bar/p' -e 's/bar/oof/p'
akan menampilkan keduanyabar
danoof
pada baris terpisah. Meskipun variasi goto-label tidak dapat menangani banyak pola karena akan menghapus garis jika pola pertama tidak cocok.Gunakan Perl:
sumber
Rapsey mengangkat poin yang relevan tentang beberapa ekspresi substitusi.
{}
(dipisahkan dengan titik koma;
atau baris baru)Sintaksis:
Contoh (lihat dokumen di sini untuk lebih jelasnya):
Kode:
Hasil:
sumber
Tidak perlu substitusi.
sumber