如何从包含许多相似模式的行中获取每个模式?

时间:2015-07-31 15:40:22

标签: regex sed grep

假设我有一行如下:

blah blah. Jon abc efg Don. blah blah. Jon afjfa kadkca Don.blah blah.

现在我想用" Jon"作为第一个词和" Don"作为最后一个,没有" Jon"或者"唐"介于两者之间。这意味着我想:

Jon abc efg Don
Jon afjfa kadkca Don

首先,我试过

egrep -o 'Jon.*Don'

但它显示

Jon abc efg Don. blah blah. Jon afjfa kadkca Don

所以我试图排除" Don"从模式的中间

egrep -o 'Jon.*[^(Don)]Don'

但它也没有用。

4 个答案:

答案 0 :(得分:2)

你可以试试这个,

grep -oP  'Jon.*?Don' file
折旧

egrepgrep -E相同。这不会支持非贪婪量词。您需要使用-P perl-regexp参数来实现非贪婪的表单。

答案 1 :(得分:1)

您应该通过向*添加?来使grep -oP 'Jon.*?Don'延迟,因此它会匹配最少的字符数。

<html> <head> <style type="text/css"> select.green_select { color: green; font-size: 8pt; } </style> </head> <body> <h1>SELECT PROBLEM</h1> <?php print '<select class="green_select">'."\n"; for ($i = 1; $i < 301; $i++) { print '<option value="'.$i.'">this should be green '.$i.'</option>'."\n"; } print '</select>'; print '<select class="green_select">'."\n"; for ($i = 1; $i < 302; $i++) { print '<option value="'.$i.'">this should be green '.$i.'</option>'."\n"; } print '</select>'; ?> </body> </html>

答案 2 :(得分:0)

我会通过将它们设置为字段分隔符来确保Jon和Don只出现一次:

awk -F"Jon|Don" '/^Jon/ && /Don$/ && NF==3' file

NF==3表示:有三个字段。字段1包含第一个字段分隔符(Jon)之前的所有内容(因此只是行的开头),字段2包含整个行,字段3包含第二个字段分隔符(Don)中的所有内容。

然后,我们还会检查以Jon开头并以Don结尾的行,以防止匹配Don JonJon Jon等行。

测试

$ cat a
Jon abc efg Don
Jon afjfa kadkca Don
Jon abc efg Don. blah blah. Jon afjfa kadkca Don
$ awk -F"Jon|Don" '/^Jon/ && /Don$/ && NF==3' a
Jon abc efg Don
Jon afjfa kadkca Don

答案 3 :(得分:0)

最后我成功地删除了前导空格。

awk&#39; {gsub(/ blah | ./,"&#34;)} {gsub(/ Jon /,&#34; Jon&#34;)} {sub(/ Don / &#34;唐\ n&#34;)} 1&#39;档案
Jon abc efg Don
Jon afjfa kadkca Don