如何使用grep查找包含多个连续破折号的字符串?

3
我想要使用 grep 查找包含破折号的字符串,例如:
---0 [58ms, 100%, 100%] 

至少有一个破折号。

我发现了这个问题:如何使用grep查找以破折号/连字符开头的字符串?

因此,我想使用:

grep -- -+ test.txt

但是我什么也没有得到。

最终,我的同事告诉我这个方法会奏效:

grep '\-\+' test.txt

是的,它有效。但是他和我都不知道搜索了很多文档后为什么有效。

这个也有效:

grep -- -* test.txt

据我所知,当您删除引号时,您的字符串“-+”首先由bash解释,但是带有引号时,它将不受影响地传递给grep命令本身,在那里它被解释为perl正则表达式。 - Dmitry Koroliov
我知道这不是一个完整的答案,但它是指向真正原因的一种指示。 - Dmitry Koroliov
+符号表示前一个字符至少出现一次,同时加上^表示行的开头。请参考维基百科关于正则表达式语法的页面:http://zh.wikipedia.org/wiki/正则表达式#语法 - shevski
1
如果你运行 grep -H -- -* * test.txt,那么 grep 会在哪个文件中列出匹配项?它是在 test.txt 中找到的还是其他文件中找到的?grep -- -\\+ test.txt 能否正常工作(这与 grep -- '-\+' test.txt 相同)? - Etan Reisner
抱歉,星号重复。 - haithink
耶!grep -- -\\+ test.txt 成功了!为什么? - haithink
1个回答

4
使用-+表示多个-。但是这对于grep来说并不是自动理解的。你需要告诉它+具有特殊含义。
你可以通过使用扩展正则表达式-E来实现:
grep -E -- "-+" file

或通过转义+符号:

grep -- "-\+" file

测试

$ cat a
---0 [58ms, 100%, 100%] 
hell
$ grep -E -- "-+" a
---0 [58ms, 100%, 100%] 
$ grep -- "-\+" a
---0 [58ms, 100%, 100%] 

来自man grep

正则表达式

基本正则表达式与扩展正则表达式

在基本正则表达式中,元字符 ?, +, {, |, (和)失去了它们的特殊含义;相反,请使用带有反斜杠的版本\?, \+, \{, \|, \(和\)


@haithink 中的 + 被视为元字符,其处理方式与其他字符不同。请参考手册中的描述。请查看我的更新。 - fedorqui
1
@haithink 感谢您的编辑!我没有注意到反斜杠没有正确显示。另外,当您的问题得到解决时,记得始终可以接受一个答案。 - fedorqui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接