你为什么要逃避和撇号之间的grep +

时间:2015-08-06 10:41:00

标签: bash grep escaping

我在单引号内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下。

2 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:2)

这似乎是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