perl使用一行程序搜索模式

perl使用一行程序搜索模式,perl,design-patterns,Perl,Design Patterns,我有一个像这样的文本文件 Hi how are you <blank> <blank> abcd <blank> defgh opqr <blank> Hi 你好吗 abcd 德夫 opqr 我想打印所有具有“某些文本”等图案的行空白“某些文本” 像 你好吗 abcd 我正在考虑使用join,然后搜索模式。但我不知道怎么做。(我所说的空白是指空行)也许我不理解这个问题。我想你要问的是,如何匹配具有相同文本(“某些文本”)的两个连续行并打印它们

我有一个像这样的文本文件

Hi
how are you
<blank>
<blank>
abcd
<blank>
defgh
opqr
<blank>
Hi
你好吗
abcd
德夫
opqr
我想打印所有具有“某些文本”等图案的行空白“某些文本” 像

你好吗
abcd

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

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

要做到这一点,你可以这样做

假设文件以字符串形式存储在$file中

print "$1\n$1" while ($file =~ /(.*)(?=\n\1(?:\n|$))/mg);
*=匹配任何内容,尽可能多地抓取

()=捕获组、存储区。*在本例中为$1

(?=…)=向前看,以便字符串的该部分可以在下一次匹配中使用

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

(?:…)=非捕获组
  • 空行:
    /^(?:(!\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


    应该如何处理
    foo BLANK bar BLANK moo BLANK mar
    呢?它应该打印整个内容,还是应该删除中间的两行空白?它应该打印整个内容好,这是我在回答中假设的:)添加了一个更简单但不太灵活的解决方案。[让尾随空格变得有意义是很恶心的!但它看起来更令人印象深刻:)]
     perl -0777ne'print /^(?:.*\S.*\n(?:(?:(?!\n)\s)*\n){2})+.*\S.*\n/mg' file
    
     perl -0777ne'print /^(?:.+\n\n\n)+.+\n/mg' file