代码之家  ›  专栏  ›  技术社区  ›  Andrew-Dufresne

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

  •  9
  • Andrew-Dufresne  · 技术社区  · 17 年前

    #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 但是没有得到正确的答案。 这是我终端上的输出

    ODSDODDF112
    dad23392eeedJ
    测试2
    对于
    你好
    

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

    编辑

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

    4 回复  |  直到 9 年前
        1
  •  8
  •   RichieHindle    17 年前

    如果确定没有前导空格,请添加 ^ * 到 + 仅当您有一个或多个字母数字字符时匹配。(即增加 -E 使用扩展正则表达式)。

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

    (我还删除了 . 从中间开始;我不知道那是怎么回事?)

        2
  •  2
  •   Robert Tupelo-Schneck    12 年前

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

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

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

        3
  •  1
  •   BryanH Philipp Andreychev    17 年前
    grep -oe "^[^ ]* " test.txt
    
        4
  •  0
  •   Onlyjob    12 年前

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

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