我有一个文件,其中列出了硬盘上的所有目录。我想删除所有包含单词“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:
将整个文件放入数组中
循环遍历数组索引
如果没有设置标志并且出现第一个匹配项,则设置一个标志
如果标志和第二行匹配,则设置另一个标志
如果两个标志和第三行都匹配,则从数组中删除这三行
结束循环
打印修改后的数组
也适用于 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
^'' 更改为仅匹配字符串的开头,将$'' 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: