
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: