我正在尝试从输入文件提取多行到输出文件行只包含头使用正则表达式在perl中。逻辑是添加行作为令牌在数组中,然后遍历数组为头。卡住匹配正则表达式模式新的一行,没有字符,而添加行作为令牌在数组中。第一个
l0oc07j21#
可以读取段落中的输入(-00开关),如果真的总是有一个空白像那里,并打印一个段落,如果它有(在这种情况下结束)一个所需的模式
perl -00 -wne'print if /\n\s*- head\s*\z/' file
我使用了\zAssert,但是在给定的示例中$也是可以的。在脚本中,这是通过设置输入记录分隔符来完成的
\z
$
use warnings; use strict; local $/ = "\n\n"; while (<>) { print if /\n\s*- head\s*\z/; }
我们需要local,这样在整个运行过程中(在一个更大的程序中)就不会对所有内容都更改$/。一个评论把问题扩大了一点,......头后面有2-3行,这也应该包括在内当文件以段落形式读取时,这很容易适应--只需更改正则表达式,使其在任何位置(不仅仅是末尾)匹配模式/行,例如
$/
/\n\s*- head\s*\n/
如果行位于末尾,这仍然匹配。
bzzcjhmw2#
当逐行阅读文件时,可以使用“滑动窗口”技术实现预期输出。
#!/usr/bin/perl use warnings; use strict; my @buffer; while (<>) { if (/- head$/) { print splice @buffer; print; } elsif (/^$/) { # Same as ("\n" eq $_) @buffer = ("\n"); } else { push @buffer, $_; } }
2条答案
按热度按时间l0oc07j21#
可以读取段落中的输入(-00开关),如果真的总是有一个空白像那里,并打印一个段落,如果它有(在这种情况下结束)一个所需的模式
我使用了
\z
Assert,但是在给定的示例中$
也是可以的。在脚本中,这是通过设置输入记录分隔符来完成的
我们需要local,这样在整个运行过程中(在一个更大的程序中)就不会对所有内容都更改
$/
。一个评论把问题扩大了一点,
......头后面有2-3行,这也应该包括在内
当文件以段落形式读取时,这很容易适应--只需更改正则表达式,使其在任何位置(不仅仅是末尾)匹配模式/行,例如
如果行位于末尾,这仍然匹配。
bzzcjhmw2#
当逐行阅读文件时,可以使用“滑动窗口”技术实现预期输出。