为什么一定要逃走 |和 + 在撇号之间的 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 正则表达式,因此请使用 egrep
或 grep -E
(取决于使用的版本)。检查你的 man grep
.
另请参阅 GNU documentation 以获取所涉及角色的完整列表。
现在大多数语言都使用扩展正则表达式 (ERE),而且它们更易于使用。基本正则表达式 (BRE) 确实是一种回归。
我是 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 正则表达式,因此请使用 egrep
或 grep -E
(取决于使用的版本)。检查你的 man grep
.
另请参阅 GNU documentation 以获取所涉及角色的完整列表。
现在大多数语言都使用扩展正则表达式 (ERE),而且它们更易于使用。基本正则表达式 (BRE) 确实是一种回归。