通过定界符从文件中提取部分文本 Perl

Extract part of text from file by delimiter Perl

我有以下类型的文本文件

helllo
worlsadas
asdfdfsgf
eqweqqweq


asdsadsadsa
asdas
dsgfv
zczcxzfada


asdsadas
asd
safdfgdsg
asdsada

....

因此有用文本的每个部分之间有两个空行。我需要提取文本的每一部分,例如数组或哈希(现在无关紧要)。
什么是最可接受的方法来做到这一点。我有一些想法:

  1. 要使用正则表达式提取一个条目^\n\n(.*\n){1,5}\n\n,但是有 这里的两个问题首先是文本文件开始时没有两个新的 行,以及如何在一个表达式中获取所有条目,否则我必须 阅读 8 行,然后借助之前的正则表达式提取代码。

  2. 简单地按行读取文件,每 8 行做一些事情。

  3. 你的变体

请建议正确的执行方法,我是新手,所以也许有更方便的方法来执行此操作。
如有任何帮助,我将不胜感激。

I need to extract each portion such portion of text, for instance in array or hash(now it doesn't matter).

((?:(?!\n\n).)+)

尝试 this.Grab each text 的组。查看演示。

https://regex101.com/r/iS6jF6/5

您可以像这样使用简单的正则表达式拆分文本:

\s\s+

Working demo

我不懂 perl 但例如你可以在 PHP:

中找到这段代码

Online code

$input = "helllo
worlsadas
asdfdfsgf
eqweqqweq


asdsadsadsa
asdas
dsgfv
zczcxzfada


asdsadas
asd
safdfgdsg
asdsada"
print_r(preg_split('/\s\s+/', $input));

输出:

Array                                                                                                                                                                                                                              
(                                                                                                                                                                                                                                  
    [0] => helllo                                                                                                                                                                                                                  
worlsadas                                                                                                                                                                                                                          
asdfdfsgf                                                                                                                                                                                                                          
eqweqqweq                                                                                                                                                                                                                          
    [1] => asdsadsadsa                                                                                                                                                                                                             
asdas                                                                                                                                                                                                                              
dsgfv                                                                                                                                                                                                                              
zczcxzfada                                                                                                                                                                                                                         
    [2] => asdsadas                                                                                                                                                                                                                
asd                                                                                                                                                                                                                                
safdfgdsg                                                                                                                                                                                                                          
asdsada                                                                                                                                                                                                                            
) 

我想你可以在 Perl 中做同样的事情:

split(/\s\s+/, $input);

Split 是一个不错的选择,使用类似的东西。
需要 2 个或更多伪 blank 行。

\n(?:\s*\n){2,}

格式化:

 \n (?: \s* \n ){2,}

参考perldoc perlvar。在 perl 中指定字段分隔符将使您可以这样做:

#!/usr/perl/bin
use strict;
use warnings;

{
    local $/ = "\n\n";
    my $count = 1;
    while (my $chunk = <DATA>) {
        print "Chunk:", $count++, "\n";
        #if you want to remove the delimiters
        $chunk =~ s/(^|\n)\n//g;
        print $chunk;
    }
}

__DATA__
helllo
worlsadas
asdfdfsgf
eqweqqweq


asdsadsadsa
asdas
dsgfv
zczcxzfada


asdsadas
asd
safdfgdsg
asdsada

这将打印:

Chunk:1
helllo
worlsadas
asdfdfsgf
eqweqqweq
Chunk:2
asdsadsadsa
asdas
dsgfv
zczcxzfada
Chunk:3
asdsadas
asd
safdfgdsg
asdsada