Im Folgenden wird die Zeilenübereinstimmung TERMINATE
bis zum Ende der Datei gedruckt :
sed -n -e '/TERMINATE/,$p'
Erklärt: -n
Deaktiviert das Standardverhalten sed
beim Drucken jeder Zeile nach dem Ausführen des Skripts. -e
Gibt ein Skript an sed
, /TERMINATE/,$
ist eine Auswahl des Adressbereichs (Zeile), dh die erste Zeile entspricht dem TERMINATE
regulären Ausdruck (wie grep) am Ende der Datei ( $
). und p
ist der Druckbefehl, der die aktuelle Zeile druckt.
Dies wird von der Zeile gedruckt, die auf die Zeilenübereinstimmung folgt, TERMINATE
bis zum Ende der Datei:
(von NACH der übereinstimmenden Zeile bis EOF, ohne die übereinstimmende Zeile)
sed -e '1,/TERMINATE/d'
Erklärt: 1,/TERMINATE/
ist eine Adressbereichsauswahl (Zeile), die die erste Zeile für die Eingabe in die erste Zeile darstellt, die dem TERMINATE
regulären Ausdruck entspricht, und d
ist der Löschbefehl, der die aktuelle Zeile löscht und zur nächsten Zeile springt. Da das sed
Standardverhalten darin besteht, die Zeilen zu drucken, werden die Zeilen nach TERMINATE
dem Ende der Eingabe gedruckt .
Bearbeiten:
Wenn Sie die Zeilen vorher wollen TERMINATE
:
sed -e '/TERMINATE/,$d'
Und wenn Sie beide Zeilen vorher und nachher TERMINATE
in 2 verschiedenen Dateien in einem Durchgang haben möchten :
sed -e '1,/TERMINATE/w before
/TERMINATE/,$w after' file
Die Vorher- und Nachher-Dateien enthalten die Zeile mit terminate. Um jede zu verarbeiten, müssen Sie Folgendes verwenden:
head -n -1 before
tail -n +2 after
Edit2:
Wenn Sie die Dateinamen im sed-Skript nicht fest codieren möchten, können Sie:
before=before.txt
after=after.txt
sed -e "1,/TERMINATE/w $before
/TERMINATE/,\$w $after" file
Aber dann müssen Sie die $
Bedeutung der letzten Zeile umgehen, damit die Shell nicht versucht, die $w
Variable zu erweitern (beachten Sie, dass wir jetzt doppelte Anführungszeichen um das Skript anstelle von einfachen Anführungszeichen verwenden).
Ich habe vergessen zu sagen, dass die neue Zeile nach den Dateinamen im Skript wichtig ist, damit sed weiß, dass die Dateinamen enden.
Bearbeiten: 2016-0530
Sébastien Clément fragte: "Wie würden Sie das Hardcodierte TERMINATE
durch eine Variable ersetzen ?"
Sie würden eine Variable für den passenden Text erstellen und dann auf die gleiche Weise wie im vorherigen Beispiel vorgehen:
matchtext=TERMINATE
before=before.txt
after=after.txt
sed -e "1,/$matchtext/w $before
/$matchtext/,\$w $after" file
So verwenden Sie eine Variable für den übereinstimmenden Text mit den vorherigen Beispielen:
## Print the line containing the matching text, till the end of the file:
## (from the matching line to EOF, including the matching line)
matchtext=TERMINATE
sed -n -e "/$matchtext/,\$p"
## Print from the line that follows the line containing the
## matching text, till the end of the file:
## (from AFTER the matching line to EOF, NOT including the matching line)
matchtext=TERMINATE
sed -e "1,/$matchtext/d"
## Print all the lines before the line containing the matching text:
## (from line-1 to BEFORE the matching line, NOT including the matching line)
matchtext=TERMINATE
sed -e "/$matchtext/,\$d"
Die wichtigsten Punkte beim Ersetzen von Text durch Variablen in diesen Fällen sind:
$variablename
In single quotes
[ '
] eingeschlossene Variablen ( ) werden nicht "erweitert", Variablen in double quotes
[ "
] jedoch. Sie müssen also alle in ändern single quotes
, double quotes
wenn sie Text enthalten, den Sie durch eine Variable ersetzen möchten.
- Die
sed
Bereiche auch enthalten $
und werden unmittelbar gefolgt von einem Buchstaben wie: $p
, $d
, $w
. Sie werden auch wie Variablen aussehen erweitert werden, so dass Sie diese fliehen müssen , um $
Zeichen mit einem Backslash [ \
] wie: \$p
, \$d
, \$w
.
grep 'TERMINATE' file