我的数据看起来与你看到的相似。我正在尝试创建一个捕获所选文本的perl脚本。关于它的想法是说“如果上一行读取是全部的,当前读取的行是全部=然后停止读取文件而不打印那些只有='s和-s的行
但是,我不知道如何编码。我3天前才开始使用perl。我不知道这是否是最佳方式。如果有更好的方法,请告诉我。 无论哪种方式,如果你可以帮助代码,我会很感激。
到目前为止我的代码:
...
$end_section_flag = "true" # I was going to use this to signify
# when I want to stop reading
# ie. when I reached the end of the
# data I want to capture
while (<$in-fh>)
{
my $line = $_;
chomp $line;
if ($line eq $string)
{
print "Found it\n";
$end_section_flag = "false";
}
if ($end_section_flag eq "false" )
{
print $out-fh "$line\n";
// if you found the end of the section i'm reading
// don't pring the -'s and ='s and exit
}
}
我的数据是什么样的
-------------------------------------------------------------------------------
===============================================================================
BLAH BLAH
===============================================================================
asdfsad
fasd
fas
df
asdf
a
\n
\n
-------------------------------------------------------------------------------
===============================================================================
BLAH BLAH
===============================================================================
...
我想要捕获的内容
-------------------------------------------------------------------------------
===============================================================================
BLAH BLAH
===============================================================================
asdfsad
fasd
fas
df
asdf
a
\n
\n
答案 0 :(得分:1)
直线处理不太合适,因为您的边界穿过了行尾。整个文件,然后用匹配运算符提取中间文件。
use strictures;
use File::Slurp qw(read_file);
my $content = read_file 'so11454427.txt', { binmode => ':raw' };
my $boundary = qr'-{79} \R ={79}'msx;
my (@extract) = $content =~ /$boundary (.*?) $boundary/gmsx;
答案 1 :(得分:0)
看看这是否符合您的需求:
perl -ne 'm/^---/...m?/---/ and print' file
如果您只想要第一个块,请将分隔符从/
更改为?
:
perl -ne 'm?^---?...m?^---? and print' file
请参阅range操作员讨论。
这将打印由'---'限定的行范围。您可以使用shell的重定向将输出重定向到您选择的文件中:
perl -ne 'm/^---/...m?/---/ and print' file > myoutput