如何让grep在第一场比赛中停止?

时间:2009-09-29 22:13:31

标签: grep

好吧,我有一个文件test.txt

#test.txt
odsdsdoddf112 test1_for_grep
dad23392eeedJ test2 for grep
Hello World test
garbage

我想提取后面有空格的字符串。我使用了以下表达式并且它有效

grep -o  [[:alnum:]]*.[[:blank:]]  test.txt

它的输出是

odsdsdoddf112
dad23392eeedJ 
test2 
for    
Hello 
World

但是问题是grep打印了所有在它们后面有空格的字符串,我希望它在一行上第一次匹配后停止,然后进入第二行。

我应该在这里使用哪个表达式,以便在第一次匹配后停止并移至下一行?

这个问题可以通过gawk或其他工具解决,但我会很感激使用grep的解决方案。

修改 我在Linux系统上使用GNU grep 2.5.1,如果这是相关的。

修改

在下面给出的答案的帮助下,我试着运气

grep  -o   ^[[:alnum:]]*  test.txt
grep  -Eo  ^[[:alnum:]]+  test.txt

两者都给了我正确的答案。

令我惊讶的是,我尝试使用

grep -Eo "^[[:alnum:]]+[[:blank:]]" test.txt

建议here但未得到正确答案。 这是我终端上的输出

odsdsdoddf112
dad23392eeedJ 
test2 
for    
Hello 
World

但RichieHindle和Adrian Pronk的评论表明他们的系统输出正确。任何人都知道为什么我也没有在我的系统上得到相同的结果。任何的想法?任何帮助将不胜感激。

修改

好吧,似乎grep 2.5.1有一些bug,因为我的输出不正确。我安装了grep 2.5.4,现在它正常工作。有关详细信息,请参阅this link

4 个答案:

答案 0 :(得分:8)

如果您确定没有前导空格,请添加^以仅匹配行的开头,并将*更改为+以仅匹配时你有一个或多个字母数字字符。 (这意味着添加-E以使用扩展正则表达式)。

grep -Eo "^[[:alnum:]]+[[:blank:]]" test.txt

(我也从中间删除了.;我不确定那里做了什么?)

答案 1 :(得分:2)

正如提问者发现的那样,在2.5.3之前的GNU grep版本中,这是bug。该错误允许插入符号在上一个匹配结束后匹配,而不仅仅是在行开头。

此bug在其他版本的grep中仍然存在,例如在Mac OS X 10.9.4中。

没有通用的解决方法,但在某些示例中,如非空格后跟空格,您通常可以通过不使用分隔符来获得所需的行为。也就是说,搜索'[^ ]*'而不是'[^ ]* '

答案 2 :(得分:1)

grep -oe "^[^ ]* " test.txt

答案 3 :(得分:0)

如果我们想要在垃圾之前提取所有有意义的输入并且实际上在第一次匹配时停止,则-B NUM, --before-context=NUM选项可能对“在匹配行之前打印NUM行前导上下文”有用。

示例:

grep --before-context=999999 "Hello World test"