我有一个巨大的文件,每个记录用空行分隔。我只需要提取那些包含特定字符串的记录。如果我使用sed,awk,perl,你会怎么做?
输入示例:
firstrecord
data
moredata
secondrecord
data
moredata2
...
我需要提取包含moredata2
的所有记录,因此输出将是
secondrecord
data
moredata2
我试过的perl代码,但是将每条记录提取到一个新文件,
我如何一次提取所有记录,以及如何从文件中读取模式?
perl -00ne 's#PAT.*/(.*)\n##; open($F,">","$1.txt"); s/\n\s*(\n|$)//g;
print $F "$_\n"' original.txt
答案 0 :(得分:2)
我的答案是 - 使用perl,设置$/
和正则表达式匹配您想要的记录。
$/
是记录分隔符。将其设置为空字符串将设置为'段落'模式,因此迭代寻找空行。这正是你需要的。
m/moredata2/
隐式匹配当前块。
#!/usr/bin/env perl
use strict;
use warnings;
local $/ = '';
while ( <DATA> ) {
if ( m/moredata2/ ) {
print "Matched:\n";
print;
}
}
__DATA__
firstrecord
data
moredata
secondrecord
data
moredata2
答案 1 :(得分:0)
请检查此代码可能对您有所帮助。你可以尝试尽可能简化。
use strict;
use warnings;
my $joinline = do { local $/; <DATA> };
while($joinline=~m/\n{2}((?:(?!moredata2).)*)moredata2\n/gs)
{
print "Matched: $&\n";
}
__DATA__
firstrecord
data
moredata
secondrecord
data
moredata2
thirdrecord
data
moredata
fourthrecord
data
moredata2
感谢。
答案 2 :(得分:0)
awk
:
awk '/moredata2/' RS="" yourfile
<强>解释强>
另一种技术是将空行分开记录。通过 特殊分配,RS表示的空字符串 记录由一个或多个空行分隔。 设置RS时 对于空字符串,每个记录总是在第一个空白行结束 遇到。下一条记录直到第一个非空白才开始 后面的行。无论连续出现多少空白行, 它们都充当一个记录分隔符。 (空行必须完整 空;仅包含空格的行不计算在内。)
检查docs
答案 3 :(得分:-1)
awk
会产生魔力
awk -v RS= '/moredata2/{print (f?"\n":"")$0; f=1}' original.txt
你明白了,
secondrecord data moredata2 ...