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?