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

如何使用sed或awk在两个单词之间找到匹配模式,awk,sed,grep,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 你可以试试这个awk: 试试这款单

我想在段落中搜索一个以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
你可以试试这个awk:


试试这款单衬里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

这可能适用于GNU sed:

sed -n '/^Word1/!b;:a;N;/^word2/M!ba;/^aaa/MP' file
忽略所有不以Word1开头的行。在模式空间中收集行,直到行开始于word2或文件结尾。如果进行了匹配,则在本例中,也在所需字符串上进行匹配。如果匹配,打印第一行并重复

编辑:如果段落可以以其他文字结尾,即word3,请使用以下内容:

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

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

awk -F'\n' -v RS= '/bbb/{print $1}' file
这将跳过查找Word1/Word2,并假设记录之间有一个空行,如示例中所示

当然,你可以事先用SSE:

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

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

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

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

这是可行的,但我希望获得段落的第一行作为输出,其中包含模式found@malmo我没有尝试我以前的脚本,它是错误的!!脚本语法不正确。现在可以了。在打印标题行之前,您的命令是否等待检查段落是否以word2结尾?如果每个段落中都有很多行是aaa,那又如何呢?它将为每个匹配项打印一次标题。@Birei这是真的。我是在检查Word2而不是Word2。现在,如果有多个模式,则在所有情况下只打印一个headerNot,因为每个段落中都假定有单词2。例如,添加两个附加段落,一个以word1开头,以word4结尾,另一个以word7开头,以word2结尾。如果aaa只出现在第二个段落中,它将打印第一个段落的标题,因为它会尝试匹配word1和word2之间的所有行,尽管它们属于不同的段落。这实际上并不完全符合要求。当然,它会根据发布的示例输入生成发布的预期输出,但这只是因为发布的示例输入没有经过深思熟虑。当你的段落只包含word1和word2而不是以它们开头时,试试看。当word1根本不存在时尝试一下。当word1在一个段落中,word2在另一个段落中时,试试看。好吧,至少现在它在一行的开头/结尾检查word1/words,但这仍然不是在一个段落的开头/结尾检查word1/words,它仍然不检查这两个单词在哪个段落中。OP似乎对它很满意,尽管如此idk…@123请看,它假设所有段落都以word2结尾。如果前提条件没有出现,命令将在前面的单词1和后面的单词2之间的每一行匹配aaa,尽管它们属于不同的段落。@Birei从问题的编写方式来看,我认为相关段落以单词1开头,以单词2结尾。但是,请参见“编辑”以获得修改后的解决方案,以便您进行解释。是。根据公认的答案,你的解释似乎是正确的,这也有类似的问题,并且对OP很有效。
$ awk -v RS= -F'\n' '/^Word1.*aaa.*word2$/{print $1}' file
Word1 this is paragraph number 1