Löschen Sie die Zeilen x nach einer Übereinstimmung

Löschen Sie die Zeilen x nach einer Übereinstimmung

Wie kann ich seddie 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.

sedWie 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} 1hier cist die n-te Zeile nach der zu ignorierenden Übereinstimmung, 1um den Eingabedatensatz auszudrucken
  • c && !--c{next}der &&Kurzschlussoperator ist, wird also nicht dekrementiert , solange er cals falsch ausgewertet wird . Nachdem auf einen Wert gesetzt wurde, wird er dekrementiert, solange er nicht erreichtcc0

Antwort3

sed '/Enter your password.*/{N;p;N;d;}' file

verwandte Informationen