3

我有一个文本文件

Hi
how are you
<blank>
<blank>
abcd
<blank>
defgh
opqr
<blank>

我想打印所有具有“some text”blankblank“some text”之类的模式的行

how are you
<blank>
<blank>
abcd

我正在考虑使用 join 然后搜索模式。但我不知道该怎么做。(空白是指空行)

4

2 回答 2

3
  • 空行:/^(?:(?!\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
于 2012-07-25T17:48:27.507 回答
1

也许我不明白这个问题。我认为您要问的是如何匹配具有相同文本(“某些文本”)的 2 个连续行并打印它们。

要做到这一点,你可以做这样的事情

假设文件存储为 $file 中的字符串

print "$1\n$1" while ($file =~ /(.*)(?=\n\1(?:\n|$))/mg);

.* = 匹配任何东西,尽可能多地抓住

() = 捕获组,在这种情况下将 .* 存储到 $1

(?= ... ) = 向前看,这样字符串的那部分就可以在下一个匹配中使用

\1 = 在第一个捕获组中捕获的任何内容(即 $1)

(?: ... ) = 非捕获组

于 2012-07-25T17:48:08.970 回答