如何使用sed或awk在两个单词之间找到匹配的模式

时间:2016-02-11 09:32:00

标签: awk sed grep

我想搜索以word1开头并以word2结尾的段落中的模式,如果模式匹配则打印段落的第一行,我不确定是否可以使用grep来完成 例如,如果我有以下文件,我正在寻找aaa

Word1 this is paragraph number 1 
aaa
bbb
ccc
word2

Word1 this is paragraph number 2 
bbb
ccc
ddd
word2

答案应该是那样的

Word1 this is paragraph number 1

5 个答案:

答案 0 :(得分:4)

这可能适合你(GNU sed):

sed -n '/^Word1/!b;:a;N;/^word2/M!ba;/^aaa/MP' file

忽略任何未开始的行Word1。收集模式空间中的行,直到从word2开始的行或文件的结尾。如果匹配,则匹配所需的字符串(在本例中为aaa)。如果匹配,则打印第一行并重复。

编辑:如果段落可以用其他词语word3结尾,请使用:

sed -n '/^Word1/!b;:a;N;/^$/Mb;/^word2/M!ba;/^aaa/MP' file

答案 1 :(得分:3)

这是一个简单的,惯用的awk解决方案:

$ awk -v RS= -F'\n' '/^Word1.*aaa.*word2$/{print $1}' file
Word1 this is paragraph number 1

如果这样做不符合您的要求,请编辑您的问题以澄清您的要求。

答案 2 :(得分:2)

您可以试试awk

awk '/^Word1/{f=1;l="";hold=$0} /word2$/{f=0; if(l ~ /aaa/){print hold}} f{l = l RS $0}' file

答案 3 :(得分:2)

尝试这一个线程AWK:

 awk '/Word1/{l=$0;flag=1;next}/word2/{flag=0}flag && $0 ~ /aaa/ && !c{print l; c++}' file

输入:

Word1 this is paragraph number 1 
aaa
aaa
bbb
aaa
word2

Word1 this is paragraph number 2 
bbb
ccc
ddd
word2

输出:

Word1 this is paragraph number 1

答案 4 :(得分:0)

一个简单的解决方案(与您要求的完全匹配):

awk -F'\n' -v RS= '/bbb/{print $1}' file

这会跳过查找Word1 / Word2,并假设您的示例中的记录之间有一个空行。

当然,您可以使用sed:

预先强制空白行
gsed 's/^Word1/\n&/' file | ...above...