Como posso sed
filtrar as linhas correspondentes de acordo com alguma expressão, mas ignorar as linhas não correspondentes, em vez de permitir que sejam impressas?
Como um exemplo real, quero executar scalac
(o compilador Scala) em um conjunto de arquivos e ler de sua -verbose
saída os .class
arquivos criados. scalac -verbose
produz um monte de mensagens, mas estamos interessados apenas nas do formulário [wrote some-class-name.class]
. O que estou fazendo atualmente é isso ( |&
é a maneira do bash 4.0 de canalizar o stderr para o próximo programa):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Isso extrairá os nomes dos arquivos das mensagens nas quais estamos interessados, mas também permitirá que todas as outras mensagens passem sem alterações! Claro que poderíamos fazer em vez disso:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
que funciona, mas se parece muito com o problema real, que é como instruir sed
a ignorar as linhas não correspondentes da entrada. Então, como fazemos isso?