Как я могу сделать 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игнорировать несовпадающие строки из ввода. Итак, как нам это сделать?