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