为什么一定要逃走 |和 + 在撇号之间的 grep?

Why do you have to escape | and + in grep between apostrophes?

我是 under the impression 在单引号内,例如'pattern', bash 特殊字符不被插入,所以只需要转义单引号本身。

为什么 echo "123" | grep '[0-9]+' 什么都不输出,而 echo "123" | grep '[0-9]\+'(加号转义)输出 123? (同样,除非您转义 |,否则 echo "123" | grep '3|4' 不会输出任何内容。)

这是在 CentOS 6.5 上的 bash 4.1.2 和 grep 2.6.3 下。

这似乎是 grep 使用的正则表达式引擎。如果您使用不同的,它会起作用:

$ echo "123" | grep '[0-9]+'
$ echo "123" | grep -P '[0-9]+'
123
$ echo "123" | grep '3|4'
$ echo "123" | grep -P '3|4'
123

grep 使用 Basic 正则表达式,如 sed 和 vi。因为你必须转义元字符,这很乏味。

您可能需要 Extended 正则表达式,因此请使用 egrepgrep -E(取决于使用的版本)。检查你的 man grep.

另请参阅 GNU documentation 以获取所涉及角色的完整列表。

现在大多数语言都使用扩展正则表达式 (ERE),而且它们更易于使用。基本正则表达式 (BRE) 确实是一种回归。