Як я можу зробити sedрядки відповідності фільтру відповідно до якогось виразу, але ігнорувати невідповідні рядки, замість того, щоб дозволити їм друкуватись?
Як реальний приклад, я хочу запустити scalac(компілятор Scala) на наборі файлів і прочитати з його -verboseрезультатів .classстворені файли. scalac -verboseвидає купу повідомлень, але нас цікавлять лише ті форми [wrote some-class-name.class]. На даний момент я роблю це ( |&це спосіб bash 4.0 до конвеєра stderr до наступної програми):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Це витягне імена файлів із повідомлень, які нас цікавлять, але також дозволить всім іншим повідомленням проходити без змін! Звичайно, ми могли б зробити замість цього:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
що працює, але схоже на те, щоб обійти справжню проблему, тобто вказівку sedігнорувати невідповідні рядки з вводу. То як ми це робимо?