【问题标题】:How to make grep stop at first match on a line?如何让 grep 在第一次匹配时停止?
【发布时间】:2014-08-22 21:29:03
【问题描述】:

嗯,我有一个文件 test.txt

#test.txt odsdsdoddf112 test1_for_grep dad23392eeedJ test2 用于 grep 你好世界测试 垃圾

我想提取后面有空格的字符串。我使用了以下表达式,它起作用了

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

它的输出是

odsdsdoddf112 爸爸23392eeedJ 测试2 为了 你好 世界

但问题是 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 爸爸23392eeedJ 测试2 为了 你好 世界

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

编辑

好吧,似乎 grep 2.5.1 有一些错误,因此我的输出不正确。我安装了 grep 2.5.4,现在它可以正常工作了。详情请见this link

【问题讨论】:

    标签: grep


    【解决方案1】:

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

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

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

    【讨论】:

    • 我将您的命令复制到我的终端,但得到了完全相同的结果。
    • @andrew-dufresne:你的文本文件有什么奇怪的地方吗?试试od -c test.txt 这是否显示了您希望看到的字符?
    • @RichieHindle:感谢您的及时回复,非常感谢。我执行了命令并得到了与 test.txt 中相同的字符
    • 我使用 GNU grep 2.5.3 进行了尝试,它产生了我期望的输出:odsdsdoddf112 dad23392eeedJ Hello
    • @RichieHindle 和@Adrian Pronk :这次我尝试了 grep -o ^[[:alnum:]]* test.txt 并且它工作正常。非常感谢。
    【解决方案2】:

    正如提问者所发现的,这是 2.5.3 之前的 GNU grep 版本中的bug。该错误允许插入符号在前一场比赛结束后进行匹配,而不仅仅是在行首。

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

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

    【讨论】:

    • 将此作为答案发布,以便更容易找到此信息。
    【解决方案3】:
    grep -oe "^[^ ]* " test.txt
    

    【讨论】:

    • 我粘贴了你的命令,得到的结果和之前一样。
    • 你是对的。我的 grep 版本 2.5.1 是罪魁祸首。安装 2.5.4 并且您的表达有效。非常感谢布莱恩。感谢您的帮助。
    【解决方案4】:

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

    例子:

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

    【讨论】:

      猜你喜欢
      • 2015-07-17
      • 1970-01-01
      • 2012-12-15
      • 2018-06-27
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2014-12-04
      • 2022-12-03
      相关资源
      最近更新 更多