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

时间:2015-03-11 17:12:24

标签: regex string perl file parsing

我有以下类型的文字文件

helllo
worlsadas
asdfdfsgf
eqweqqweq


asdsadsadsa
asdas
dsgfv
zczcxzfada


asdsadas
asd
safdfgdsg
asdsada

....

因此,在有用文本的每个部分之间有两个空行。我需要提取每个部分的文本部分,例如数组或哈希(现在它并不重要)。
最可接受的方法是什么?我有一些想法:

  1. 使用正则表达式提取一个条目^\n\n(.*\n){1,5}\n\n,但在那里 这里的两个问题首先是文本文件没有两个新文件 行,以及如何获取一个表达式中的所有条目或我必须 在前面的正则表达式的帮助下读取8行而不是提取代码。

  2. 只需逐行读取文件,然后每8行做一些东西。

  3. 您的变体

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

4 个答案:

答案 0 :(得分:1)

参考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

答案 1 :(得分:0)

  

我需要提取每个部分的文本部分,例如数组或哈希(现在没关系)。

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

试试这个。抓住each text的群组。参见演示。

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

答案 2 :(得分:0)

拆分是一个很好的选择,使用这样的东西 需要2个或更多伪空白行。

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

格式化:

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

答案 3 :(得分:-1)

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

\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);