Verwenden Sie sed – oder was – um mehrere Zeilen abzugleichen und zu löschen, z. B. „Verzeichnis“ gefolgt von zwei Leerzeilen?

Verwenden Sie sed – oder was – um mehrere Zeilen abzugleichen und zu löschen, z. B. „Verzeichnis“ gefolgt von zwei Leerzeilen?

Ich habe eine Datei, in der alle Verzeichnisse auf einer Festplatte aufgelistet sind. Ich möchte alle Instanzen einer Zeile mit dem Wort „Verzeichnis“ gefolgt von zwei leeren Zeilen löschen. Das heißt, ich möchte alle drei dieser Zeilen jedes Mal löschen, wenn die Sequenz auftritt.

Ich habe bereits alle Zeilen mit "<DIR> .", "<DIR> ..", und "0 Files"-- gelöscht, es sind aber immer noch einige Reste vorhanden.

Die ursprüngliche Aufgabe bestand darin, jede 6-zeilige Sequenz mit dem folgenden Muster zu löschen:

Directory of m:\Winter Interludes

12/20/2020  10:24 PM    DIR          .
12/20/2010  10:24 PM    DIR          ..
               0 File(s)              0 bytes

Antwort1

Perl:

ganze Datei in Array schlürfen

Schleife über den Array-Index

Wenn keine Flags gesetzt sind und die erste Übereinstimmung erscheint, setzen Sie ein Flag

Wenn Flag und zweite Zeile übereinstimmen, setze ein weiteres Flag

Wenn sowohl die Flagge als auch die dritte Zeile übereinstimmen, löschen Sie die drei Zeilen aus dem Array.

Schleife beenden

Geändertes Array wieder ausgeben

sollte auch in Python funktionieren

--

Wenn Sie einen einzelnen regulären Ausdruck verwenden möchten, um mehrere Zeilen abzugleichen, hat Perl dafür ein Post-Regex-Flag „m“. Von perlre:

m Behandeln Sie den String als mehrere Zeilen. Das heißt, ändern Sie ^'' and$'' von der Übereinstimmung nur am Anfang oder Ende des Strings in den Anfang oder das Ende einer beliebigen Zeile innerhalb des Strings.

s Behandeln Sie die Zeichenfolge als einzelne Zeile. Das heißt, ändern Sie .'' to match any character whatsoever, even a newline, which it normally would not match. The /s and /m modifiers both override the $* setting. That is, no matter what $* contains, /s without /m will force ^'' so, dass es nur am Anfang der Zeichenfolge passt, und $'' to match only at the end (or just before a newline at the end) of the string. Together, as /ms, they let the.'' so, dass es mit jedem beliebigen Zeichen übereinstimmt, während ^'' and$'' innerhalb der Zeichenfolge direkt nach bzw. vor Zeilenumbrüchen übereinstimmen muss.

Antwort2

perl -0777 -p -e ‚s/[^\n]*Verzeichnis[^\n]*\n\n\n//sg‘ Eingabe

Antwort3

In vim könnten Sie Folgendes verwenden: :%s:Directory{ctrl+v, return}{ctrl+v}return:

verwandte Informationen