%20%D0%B4%D0%BB%D1%8F%20%D1%81%D0%BE%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B8%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%2C%20%D0%BD%D0%B0%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%2C%20%C2%ABDirectory%C2%BB%20%D0%B8%20%D0%B4%D0%B2%D1%83%D1%85%20%D0%BF%D1%83%D1%81%D1%82%D1%8B%D1%85%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%3F.png)
У меня есть файл со списком всех каталогов на жестком диске. Я хочу удалить все экземпляры строки со словом «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
решение1
перл:
записать весь файл в массив
Цикл по индексу массива
если флаги не установлены и появляется первое совпадение, установить флаг
если флаг и вторая строка совпадают, установить другой флаг
если оба флага и третья строка совпадают, то удаляем три строки из массива
Конец петли
Распечатать измененный массив обратно
также должно работать в питоне
--
Если вы хотите использовать одно регулярное выражение для сопоставления нескольких строк, в Perl для этого есть флаг после регулярного выражения "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
$'' соответствовать сразу после и сразу перед символами новой строки в строке соответственно.
решение2
perl -0777 -p -e 's/[^\n]*Directory[^\n]*\n\n\n//sg' ввод
решение3
В vim можно использовать:
:%s:Directory{ctrl+v, return}{ctrl+v}return: