假设我有一行如下:
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'
但它也没有用。
答案 0 :(得分:2)
你可以试试这个,
grep -oP 'Jon.*?Don' file
折旧 egrep
与grep -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 Jon
或Jon 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