
Wie kann ich sed
die Zeilen zwei (oder eine beliebige Zahl) nach einer Übereinstimmung löschen, ohne die Übereinstimmung und die Zeilen dazwischen einzuschließen?
Zum Beispiel:
Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
> mysecretword
Password accepted
Ich möchte nur die Zeile „> mysecretword“ löschen, da sie zwei Zeilen nach der Zeile „Geben Sie an der folgenden Eingabeaufforderung Ihr Kennwort ein“ steht. Ich kann keine absoluten Zeilennummernpositionen verwenden, da die Übereinstimmung eine beliebige Anzahl Zeilen nach dem Beginn der Datei erscheinen könnte.
Bei meiner Onlinesuche finde ich viele Lösungen wie sed '/Enter your password.*/,+3d' filex
, aber dadurch würde auch die Zeile „Geben Sie Ihr Passwort ein …“ und die folgende Zeile entfernt, was ich nicht möchte. Ich möchte nur eine Zeile entfernen, also eine bestimmte Anzahl von Zeilen nach einer Übereinstimmung.
sed
Wie kann ich dies (oder auch mit einem anderen allgemein verfügbaren Werkzeug) tun ?
Antwort1
Vielleicht
sed '/^Enter your password/ {
n
n
d
}' file
oder gleichwertig:
$ sed '/^Enter your password/ {n;n;d;}' file
Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
Password accepted
Antwort2
Allgemeine Fälle finden Sie in dieser hervorragenden Antwort von Ed Morton:Drucken einer Zeile nach einem passenden Muster mit sed oder awk .
d) Drucken Sie alle Datensätze außer dem N-ten Datensatz nach einem regulären Ausdruck:
awk 'c&&!--c{next}/regexp/{c=N}1' file
Bewerben für vorgegebene Eingaben
$ awk 'c && !--c{next} /^Enter your password/{c=2} 1' ip.txt
Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
Password accepted
/^Enter your password/{c=2} 1
hierc
ist die n-te Zeile nach der zu ignorierenden Übereinstimmung,1
um den Eingabedatensatz auszudruckenc && !--c{next}
der&&
Kurzschlussoperator ist, wird also nicht dekrementiert , solange erc
als falsch ausgewertet wird . Nachdem auf einen Wert gesetzt wurde, wird er dekrementiert, solange er nicht erreichtc
c
0
Antwort3
sed '/Enter your password.*/{N;p;N;d;}' file