Im Folgenden wird die Zeilenübereinstimmung TERMINATEbis zum Ende der Datei gedruckt :
sed -n -e '/TERMINATE/,$p'
Erklärt: -n Deaktiviert das Standardverhalten sedbeim Drucken jeder Zeile nach dem Ausführen des Skripts. -eGibt ein Skript an sed, /TERMINATE/,$ist eine Auswahl des Adressbereichs (Zeile), dh die erste Zeile entspricht dem TERMINATEregulären Ausdruck (wie grep) am Ende der Datei ( $). und pist der Druckbefehl, der die aktuelle Zeile druckt.
Dies wird von der Zeile gedruckt, die auf die Zeilenübereinstimmung folgt, TERMINATEbis 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 TERMINATEregulären Ausdruck entspricht, und dist der Löschbefehl, der die aktuelle Zeile löscht und zur nächsten Zeile springt. Da das sedStandardverhalten 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 TERMINATEin 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 $wVariable 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 TERMINATEdurch 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:
$variablenameIn single quotes[ '] eingeschlossene Variablen ( ) werden nicht "erweitert", Variablen in double quotes[ "] jedoch. Sie müssen also alle in ändern single quotes, double quoteswenn sie Text enthalten, den Sie durch eine Variable ersetzen möchten.
- Die
sedBereiche 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