Wie kann ich sed
Filter-Matching-Zeilen nach einem bestimmten Ausdruck erstellen, aber nicht übereinstimmende Zeilen ignorieren, anstatt sie drucken zu lassen?
Als echtes Beispiel möchte ich scalac
(den Scala-Compiler) für eine Reihe von Dateien ausführen und -verbose
die .class
erstellten Dateien aus der Ausgabe lesen . scalac -verbose
gibt eine Reihe von Nachrichten aus, aber wir interessieren uns nur für die des Formulars [wrote some-class-name.class]
. Was ich gerade mache, ist Folgendes ( |&
ist Bash 4.0s Weg, um stderr zum nächsten Programm zu leiten):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Dadurch werden die Dateinamen aus den Nachrichten extrahiert, an denen wir interessiert sind, aber auch alle anderen Nachrichten bleiben unverändert! Natürlich könnten wir stattdessen Folgendes tun:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Das funktioniert, sieht aber sehr danach aus, das eigentliche Problem sed
zu umgehen. So wird angewiesen , nicht übereinstimmende Zeilen von der Eingabe zu ignorieren. Wie machen wir das?