¿Cómo puedo sed
filtrar las líneas coincidentes de acuerdo con alguna expresión, pero ignorar las líneas que no coinciden, en lugar de dejar que se impriman?
Como ejemplo real, quiero ejecutar scalac
(el compilador Scala) en un conjunto de archivos y leer de su -verbose
salida los .class
archivos creados. scalac -verbose
genera un montón de mensajes, pero solo nos interesan los del formulario [wrote some-class-name.class]
. Lo que estoy haciendo actualmente es esto ( |&
es la forma de bash 4.0 de canalizar stderr al siguiente programa):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Esto extraerá los nombres de archivo de los mensajes que nos interesan, ¡pero también permitirá que todos los demás mensajes pasen sin cambios! Por supuesto que podríamos hacer en su lugar esto:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
que funciona pero se parece mucho a solucionar el problema real, que es cómo dar instrucciones sed
para ignorar las líneas que no coinciden de la entrada. ¿Entonces cómo hacemos eso?