Làm cách nào để tạo sed
bộ lọc các dòng phù hợp theo một số biểu thức, nhưng bỏ qua các dòng không khớp, thay vì để chúng in?
Như một ví dụ thực tế, tôi muốn chạy scalac
(trình biên dịch Scala) trên một tập hợp các tệp và đọc từ -verbose
đầu ra của nó các .class
tệp đã tạo. scalac -verbose
xuất ra một loạt các thông báo, nhưng chúng tôi chỉ quan tâm đến những thông báo có dạng [wrote some-class-name.class]
. Những gì tôi hiện đang làm là đây ( |&
là cách của bash 4.0 để chuyển hướng trình duyệt sang chương trình tiếp theo):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Thao tác này sẽ trích xuất tên tệp từ các thư mà chúng tôi quan tâm, nhưng cũng sẽ cho phép tất cả các thư khác đi qua không thay đổi! Tất nhiên thay vào đó chúng tôi có thể làm như sau:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
hoạt động nhưng trông rất giống với vấn đề thực sự, đó là cách hướng dẫn sed
bỏ qua các dòng không khớp từ đầu vào. Vì vậy, làm thế nào để chúng tôi làm điều đó?