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?
Antworten:
Ein anderer Weg mit einfachem Sed:
s///
ist eine Substitution,t
ohne Beschriftung überspringt bedingt alle folgenden Befehle,d
löscht Zeile.Keine Notwendigkeit für Perl oder Grep.
(bearbeitet nach Nicholas Rileys Vorschlag)
quelle
tx
undd
mit einem Zeilenumbruch anstatt mit einem Semikolon, wie ich es bekamundefined label 'x;d;:x'
.sed -e 's/.../.../' -e 'tx' -e 'd' -e ':x'
(vorgeschlagen in einem Kommentar zu einer ähnlichen Frage ).sed -e 's/.../.../' -e 't' -e 'd'
.-e
Option nicht, also erwähnen Sie sie nicht allgemein.Wenn Sie keine Zeilen drucken möchten, die nicht übereinstimmen, können Sie die Kombination von verwenden
-n
Option, die sed anweist, nicht zu druckenp
Flag, das sed anweist, zu drucken, was übereinstimmtDas gibt:
quelle
echo foo | sed -n -e 's/foo/bar/p' -e 's/bar/oof/p'
Gibt beidebar
undoof
in separaten Zeilen aus. Obwohl die goto-label-Variante auch nicht mehrere Muster verarbeiten kann, wird die Zeile gelöscht, wenn das erste Muster nicht übereinstimmt.Verwenden Sie Perl:
quelle
Eine Substitution ist nicht erforderlich.
quelle
Rapsey sprach einen relevanten Punkt über mehrere Substitutionsausdrücke an.
{}
(getrennt durch ein Semikolon;
oder eine neue Zeile).Syntax:
Beispiel (siehe hier Dokument für weitere Details):
Code:
Ergebnis:
quelle