通过定界符从文件中提取部分文本 Perl
Extract part of text from file by delimiter Perl
我有以下类型的文本文件
helllo
worlsadas
asdfdfsgf
eqweqqweq
asdsadsadsa
asdas
dsgfv
zczcxzfada
asdsadas
asd
safdfgdsg
asdsada
....
因此有用文本的每个部分之间有两个空行。我需要提取文本的每一部分,例如数组或哈希(现在无关紧要)。
什么是最可接受的方法来做到这一点。我有一些想法:
要使用正则表达式提取一个条目^\n\n(.*\n){1,5}\n\n
,但是有
这里的两个问题首先是文本文件开始时没有两个新的
行,以及如何在一个表达式中获取所有条目,否则我必须
阅读 8 行,然后借助之前的正则表达式提取代码。
简单地按行读取文件,每 8 行做一些事情。
你的变体
请建议正确的执行方法,我是新手,所以也许有更方便的方法来执行此操作。
如有任何帮助,我将不胜感激。
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
的组。查看演示。
您可以像这样使用简单的正则表达式拆分文本:
\s\s+
我不懂 perl 但例如你可以在 PHP:
中找到这段代码
$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
我有以下类型的文本文件
helllo
worlsadas
asdfdfsgf
eqweqqweq
asdsadsadsa
asdas
dsgfv
zczcxzfada
asdsadas
asd
safdfgdsg
asdsada
....
因此有用文本的每个部分之间有两个空行。我需要提取文本的每一部分,例如数组或哈希(现在无关紧要)。
什么是最可接受的方法来做到这一点。我有一些想法:
要使用正则表达式提取一个条目
^\n\n(.*\n){1,5}\n\n
,但是有 这里的两个问题首先是文本文件开始时没有两个新的 行,以及如何在一个表达式中获取所有条目,否则我必须 阅读 8 行,然后借助之前的正则表达式提取代码。简单地按行读取文件,每 8 行做一些事情。
你的变体
请建议正确的执行方法,我是新手,所以也许有更方便的方法来执行此操作。
如有任何帮助,我将不胜感激。
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
的组。查看演示。
您可以像这样使用简单的正则表达式拆分文本:
\s\s+
我不懂 perl 但例如你可以在 PHP:
中找到这段代码$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