2

У меня есть файл со списком всех каталогов на жестком диске. Я хочу удалить все экземпляры строки со словом "Каталог", за которыми следуют две пустые строки. То есть я хочу удалить все три из этих строк каждый раз, когда происходит последовательность.

Я уже удалил все строки с "<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

3 ответа3

2

Perl:

хлебать весь файл в массив

Цикл по индексу массива

если флаги не установлены и появляется первое совпадение, установите флаг

если флаг и вторая строка совпадают, установите другой флаг

если и флаг, и третья строка совпадают, удалите три строки из массива

Конец цикла

Распечатать измененный массив обратно

также должен работать в Python

-

Если вы хотите использовать одно регулярное выражение для сопоставления по нескольким строкам, для этого в 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 ^ '' совпадать только в начале строки, а $ '' совпадать только в конце (или непосредственно перед новой строкой в конце) строка.Вместе, как /ms, они позволяют. '' Соответствовать любому символу, но в то же время позволяют ^ '' и $ '' соответствовать соответственно сразу после и непосредственно перед символами новой строки в строке.

2
perl -0777 -p -e 's/[^\n]*Directory[^\n]*\n\n\n//sg' input
1

В vim вы можете использовать:::%s:Directory{ctrl+v, return}{ctrl+v}return:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .