我有一个文本文件
Hi
how are you
<blank>
<blank>
abcd
<blank>
defgh
opqr
<blank>
我想打印所有具有“some text”blankblank“some text”之类的模式的行
how are you
<blank>
<blank>
abcd
我正在考虑使用 join 然后搜索模式。但我不知道该怎么做。(空白是指空行)
我有一个文本文件
Hi
how are you
<blank>
<blank>
abcd
<blank>
defgh
opqr
<blank>
我想打印所有具有“some text”blankblank“some text”之类的模式的行
how are you
<blank>
<blank>
abcd
我正在考虑使用 join 然后搜索模式。但我不知道该怎么做。(空白是指空行)
/^(?:(?!\n)\s)*\n/m
/^.*\S.*\n/m
因此,您要打印以下所有实例:
/
^
(?:
.*\S.*\n
(?: (?:(?!\n)\s)*\n ){2}
)+
.*\S.*\n
/mx
作为一个孤独的班轮:
perl -0777ne'print /^(?:.*\S.*\n(?:(?:(?!\n)\s)*\n){2})+.*\S.*\n/mg' file
如果所有空行都不包含空格,则可以简化一些:
/^\n/m
/^.+\n/m
perl -0777ne'print /^(?:.+\n\n\n)+.+\n/mg' file
也许我不明白这个问题。我认为您要问的是如何匹配具有相同文本(“某些文本”)的 2 个连续行并打印它们。
要做到这一点,你可以做这样的事情
假设文件存储为 $file 中的字符串
print "$1\n$1" while ($file =~ /(.*)(?=\n\1(?:\n|$))/mg);
.* = 匹配任何东西,尽可能多地抓住
() = 捕获组,在这种情况下将 .* 存储到 $1
(?= ... ) = 向前看,这样字符串的那部分就可以在下一个匹配中使用
\1 = 在第一个捕获组中捕获的任何内容(即 $1)
(?: ... ) = 非捕获组