我想搜索以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
答案 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...