具有' - '字符模式的grep行为

时间:2014-06-09 15:14:46

标签: regex bash shell grep

我的问题的实际答案可能非常简单(可能我只需要再次阅读reg-ex教程)。但这更多的是我用grep和' - '字符看到的行为。

我有一个补丁文件(diff.txt),其中包含像。

这样的条目
--- a/path/to/xyz

+++ b/path/to/modified/xyz

现在,出于某种原因,我想要在文件中grep所有包含“---”模式的行。

在简单的grep命令未能给出我想要的内容后,我尝试了以下三个命令:

$ grep "-" ./diff.txt

上面的结果显示所有存在' - '符号(单次出现,多次出现)的结果。

$ grep  "--" ./diff.txt

这个没有产生任何结果。没有输出。 Grep卡在某个循环中?(试图找出不存在的东西?)。必须按Ctrl-C才能停止命令。

$ grep "---"  ./diff.txt

在此之后,Grep抱怨无法识别的模式并打印帮助信息。

如果有人想知道,我确实用“+++”模式尝试相同的命令,而简单的grep命令就像魅力一样:

$ grep "+++" ./diff.txt   --> output all the lines correctly.

如果有人能用“ - ”字符来解释这种奇怪的行为,我将不胜感激。

3 个答案:

答案 0 :(得分:3)

Grep可能会尝试将您的模式解释为一种选择。

使用-e将其明确化:

grep -e --- ./diff.txt

答案 1 :(得分:3)

-开头的模式被解释为选项

--表示选项结束

使用--告诉grep以下任何参数都不是选项。

grep -- pattern path...

答案 2 :(得分:1)

由于您的模式以破折号开头,因此它被解释为一个选项。使用--选项明确指示选项的结尾,或明确指出您的模式 是带有-e选项的模式。

$ echo -e "---abc\ndef\n---ghi\njkl"
---abc
def
---ghi
jkl

$ echo -e "---abc\ndef\n---ghi\njkl" | grep -- ---
---abc
---ghi

$ echo -e "---abc\ndef\n---ghi\njkl" | grep -e ---
---abc
---ghi

-e命令的echo选项允许像\n这样的c样式转义。)