如何显示从多行模式到末尾的文件内容包括图案本身?
我刚才问了一个类似的问题,但它是不同的,我想我应该将其作为一个单独的新问题发布。所以请不要仅仅因为这个就标记这个重复项!
例如,如果我有一个像这样的文本文件:
cat
dog
fox
cow
dove
bird
bunny
gnu
hen
dove
bird
buffalo
如果我的模式是这样的:
dove
bird
bunny
我想要得到的是:
dove
bird
bunny
gnu
hen
dove
bird
buffalo
我的真实文件很大,因此如果有多种方法可以实现此目的,我更喜欢更快的方法。
答案1
如果您想从图案第一次出现时开始打印,这很容易。遵循我在中描述的相同逻辑另一个答案,但有一些额外的逻辑:
解析.sed
/^dove$/ { # Match multi-line pattern
N # /
N # /
/\nbird\nbunny$/bb # When matched jump to label b
}
d # Restart with next line if no match
:b # \
n # Print the rest of the file
bb # /
像这样运行它:
sed -f parse.sed infile
或者作为便携式单线:
sed -n -e '/^dove$/{N;N;/\nbird\nbunny$/bb' -e '};d;:b' -e 'p;n;bb' infile
两种情况下的输出:
dove
bird
bunny
gnu
hen
dove
bird
buffalo
答案2
这是一个 Perl 解决方案:
perl -0777 -ne 'print $1,$2 if m/(dove.bird.bunny)(.*)/sm' myfile
这输出:
dove
bird
bunny
gnu
hen
dove
bird
buffalo
开关-0777
打开吸食将整个文件读入内存的模式。使用sm
匹配修饰符允许点匹配换行符,同时将字符串视为多行。
该-n
开关为输入文件创建一个读取循环。当序列鸽子绑定兔子$1
看到它,它与剩余的行一起被捕获$2
,这就是整体匹配成功时打印的内容。
答案3
awk解决方案:
awk -v RS=" " '{ # considering space as record separator
for(i=1;i<=NF;i++) { # iterating through all fields
if ($i=="dove" && $(i+1)=="bird" && $(i+2)=="bunny") { f=1 }
if (f) print $i
}
}' file
输出:
dove
bird
bunny
gnu
hen
dove
bird
buffalo