如何使grep在一条线上的第一场比赛中停止?

如何使grep在一条线上的第一场比赛中停止?,grep,Grep,我有一个test.txt文件 #test.txt odsdsdoddf112 test1_for_grep dad23392eeedJ test2 for grep Hello World test garbage #test.txt 用于grep的ODSDODDF112测试1 grep的dad23392eeedJ测试2 你好,世界测试 垃圾 我想提取后面有空格的字符串。我用了下面的表达,它起了作用 grep -o [[:alnum:]]*.[[:blank:]] test.txt grep

我有一个test.txt文件

#test.txt odsdsdoddf112 test1_for_grep dad23392eeedJ test2 for grep Hello World test garbage #test.txt 用于grep的ODSDODDF112测试1 grep的dad23392eeedJ测试2 你好,世界测试 垃圾 我想提取后面有空格的字符串。我用了下面的表达,它起了作用

grep -o [[:alnum:]]*.[[:blank:]] test.txt grep-o[[:alnum:][]*[[:blank:][]test.txt 它的产量是

odsdsdoddf112 dad23392eeedJ test2 for Hello World ODSDODDF112 dad23392eeedJ 测试2 对于 你好 世界 但问题是grep打印所有后面有空格的字符串,我希望它在第一行匹配后停止,然后继续第二行

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

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

编辑 如果相关的话,我会在Linux系统上使用GNU grep 2.5.1

编辑

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

grep -o ^[[:alnum:]]* test.txt grep -Eo ^[[:alnum:]]+ test.txt grep-o^[:alnum:]*test.txt grep-Eo^[:alnum:]+test.txt 两人都给了我正确的答案

现在让我惊讶的是,我尝试使用

grep -Eo "^[[:alnum:]]+[[:blank:]]" test.txt grep-Eo“^[:alnum:][]+[[:blank:][]”test.txt 如建议的那样,但没有得到正确的答案。 这是我终端上的输出

odsdsdoddf112 dad23392eeedJ test2 for Hello World ODSDODDF112 dad23392eeedJ 测试2 对于 你好 世界 但RichieHindle和Adrian Pronk的评论表明,他们的系统得到了正确的输出。任何人都知道为什么我也不能在我的系统上得到同样的结果。有什么想法吗?任何帮助都将不胜感激

编辑


嗯,grep2.5.1似乎有一些错误,因为我的输出不正确。我安装了grep2.5.4,现在它工作正常。有关详细信息,请参阅。

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


(我还从中间删除了
;我不确定这是在做什么?

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

例如:

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

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

这个bug仍然存在于其他版本的grep中,例如macosx10.9.4


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

我将您的命令复制到了我的终端,但得到了完全相同的结果。@andrew dufresne:您的文本文件有什么奇怪的地方吗?试试看
od-c test.txt
这是否显示了您希望看到的字符?@RichieHindle:谢谢您的及时回复,我非常感谢。我执行了这个命令,得到了与测试中相同的字符。txt我使用GNU grep 2.5.3尝试了这个方法,它生成了我期望的输出:odsdoddf112 dad23392eeedJ Hello@RichieHindle和@Adrian Pronk:这次我尝试了grep-o^[:alnum:]*test.txt,它工作正常。非常感谢。我粘贴了你的命令,得到了与之前相同的结果。你是对的。我的grep版本2.5.1就是罪魁祸首。安装了2.5.4,您的表达式工作正常。非常感谢布莱恩。非常感谢您的帮助。将此作为答案发布,以便更容易找到此信息。
grep -oe "^[^ ]* " test.txt
grep --before-context=999999 "Hello World test"