Як я можу зробити 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
ігнорувати невідповідні рядки з вводу. То як ми це робимо?