Bir sed
ifadeye göre filtre eşleştirme satırlarını nasıl yapabilirim , ancak eşleşmeyen satırları yazdırmalarına izin vermek yerine yoksayabilirim?
Gerçek bir örnek olarak, scalac
bir dizi dosya üzerinde çalıştırmak (Scala derleyicisini) ve -verbose
çıktısından .class
oluşturulan dosyaları okumak istiyorum . scalac -verbose
bir sürü mesaj çıkarır, ancak biz sadece formdakilerle ilgileniyoruz [wrote some-class-name.class]
. Şu anda yaptığım şey şudur ( |&
bash 4.0'ın stderr'i sonraki programa aktarmanın yolu):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Bu, ilgilendiğimiz mesajlardan dosya adlarını çıkaracak, ancak diğer tüm mesajların değişmeden geçmesine de izin verecektir! Tabii ki bunun yerine şunu yapabiliriz:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Bu işe yarıyor ama gerçek problemin etrafından dolaşmaya çok benziyor, bu sed
da girdiden eşleşmeyen satırları yok sayma talimatı verilecek. Peki bunu nasıl yapacağız?