我在单引号内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下。
答案 0 :(得分:6)
grep
使用 Basic 正则表达式,如sed和vi。因为你必须逃避元字符,这很乏味。
您可能需要扩展正则表达式,因此请使用egrep
或grep -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