Использовать sed (или что-то подобное) для сопоставления и удаления нескольких строк, например, «Directory» и двух пустых строк?

Использовать sed (или что-то подобное) для сопоставления и удаления нескольких строк, например, «Directory» и двух пустых строк?

У меня есть файл со списком всех каталогов на жестком диске. Я хочу удалить все экземпляры строки со словом «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:

Связанный контент