perl one liner来搜索图案

时间:2012-07-25 17:41:03

标签: perl design-patterns

我有一个像

这样的文本文件
Hi
how are you
<blank>
<blank>
abcd
<blank>
defgh
opqr
<blank>

我想要打印所有具有“some text”模式的行“blankblank”some text“ 喜欢

how are you
<blank>
<blank>
abcd

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

也许我不理解这个问题。我想你要问的是如何匹配2个具有相同文本(“某些文本”)的连续行并打印出来。

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

假设文件存储为$ file

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

。* =匹配任何东西,尽可能多地抓起来

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

(?= ...)=向前看,以便该部分字符串可用于下一场比赛

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

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