Используйте sed — или что — чтобы соответствовать и удалить несколько строк, т.е. “Каталог”, сопровождаемый двумя пустыми строками?

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

3 ответа

perl -0777 -p -e 's/[^\n]*Directory[^\n]*\n\n\n//sg' input
2
ответ дан 08.12.2019, 05:51

жемчуг:

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

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

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

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

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

Цикл конца

Распечатайте измененный массив назад

должен также работать в 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$'' для соответствия, соответственно, сразу после и незадолго до новых строк в строке.

2
ответ дан 08.12.2019, 05:51

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

1
ответ дан 08.12.2019, 05:51

Теги

Похожие вопросы