我的问题的实际答案可能非常简单(可能我只需要再次阅读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.
如果有人能用“ - ”字符来解释这种奇怪的行为,我将不胜感激。
答案 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样式转义。)