Wie kann ich sedFilter-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 -verbosedie .classerstellten Dateien aus der Ausgabe lesen . scalac -verbosegibt 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 sedzu umgehen. So wird angewiesen , nicht übereinstimmende Zeilen von der Eingabe zu ignorieren. Wie machen wir das?