¿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?
Respuestas:
Otra forma con sed simple:
s///
es una sustitución,t
sin ninguna etiqueta, omite condicionalmente todos los comandos siguientes,d
elimina la línea.No necesita perl ni grep.
(editado según la sugerencia de Nicholas Riley)
fuente
tx
yd
con una nueva línea en lugar de un punto y coma como estaba obteniendoundefined label 'x;d;:x'
.sed -e 's/.../.../' -e 'tx' -e 'd' -e ':x'
(sugerido en un comentario sobre una pregunta similar ).sed -e 's/.../.../' -e 't' -e 'd'
.-e
opción, así que no lo mencione en general.Si no desea imprimir líneas que no coincidan, puede utilizar la combinación de
-n
opción que le dice a sed que no imprimap
bandera que le dice a sed que imprima lo que coincideEsto da:
fuente
echo foo | sed -n -e 's/foo/bar/p' -e 's/bar/oof/p'
generará ambosbar
yoof
en líneas separadas. Aunque la variedad Ir a etiqueta tampoco puede manejar varios patrones, ya que eliminará la línea si el primer patrón no coincide.Utilice Perl:
fuente
Rapsey planteó un punto relevante sobre las expresiones de sustituciones múltiples.
{}
(separados por un punto y coma;
o una nueva línea)Sintaxis:
Ejemplo (consulte el documento Aquí para obtener más detalles):
Código:
Resultado:
fuente
No hay necesidad de sustitución.
fuente