У меня есть файл, перечисляющий все каталоги на жестком диске. Я хочу удалить все экземпляры строки со словом "Directory", сопровождаемым двумя пустыми строками. Таким образом, я хочу удалить все три из тех строк каждый раз, когда последовательность происходит.
Я уже удалил все строки с "<DIR> ."
, "<DIR> .."
, и "0 Files"
- но существует все еще некоторый оставшийся материал.
Исходная задача состояла в том, чтобы удалить каждую последовательность с 6 строками со следующим шаблоном:
Directory of m:\Winter Interludes
12/20/2020 10:24 PM DIR .
12/20/2010 10:24 PM DIR ..
0 File(s) 0 bytes
perl -0777 -p -e 's/[^\n]*Directory[^\n]*\n\n\n//sg' input
жемчуг:
хлебайте целый файл в массив
Цикл по индексу массива
если никакие флаги не установлены, и первое соответствие появляется, установите флаг
если флаг и вторые соответствия строки, устанавливают другой флаг
если и флаг и третьи соответствия строки затем удаляют эти три строки из массива
Цикл конца
Распечатайте измененный массив назад
должен также работать в Python
--
Если Вы хотите использовать единственный regexp для соответствия через несколько строк, жемчуг имеет флаг post-regex "m" для этого. От perlre:
m строка Обработки как несколько строк. Таким образом, изменение
^'' and
$'' от соответствия в только очень запускаются или конец строки к запуску или конец любой строки где угодно в строке,s строка Обработки как одна строка. Таким образом, изменение
.'' 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
^'' для соответствия только в начале строки и$'' to match only at the end (or just before a newline at the end) of the string. Together, as /ms, they let the
.'' соответствуйте любому символу вообще, все же позволяя^'' and
$'' для соответствия, соответственно, сразу после и незадолго до новых строк в строке.
В энергии Вы могли использовать: :%s:Directory{ctrl+v, return}{ctrl+v}return: