Grep 正则表达式不适用于方括号

Grep regex not working with square brackets

所以我试图在 grep 中编写一个正则表达式来匹配方括号,即 [ad] 应该匹配 []。但是我在使用捕获组和字符 classes 时得到了不同的结果。此外,将 ' 放在正则表达式字符串的开头和结尾的结果也不同。

所以这些是我得到的不同结果。

使用捕获组效果很好

echo "[ad]" | grep -E '(\[|\])'
[ad]

使用不带 ' 的捕获组会产生语法错误

echo "[ad]" | grep -E (\[|\])
bash: syntax error near unexpected token `('

使用字符 class 和 [ 后跟 ] 没有输出

echo "[ad]" | grep -E [\[\]]

使用字符 class 和 ] 后跟 [ 可以正常工作

echo "[ad]" | grep -E [\]\[]
[ad]

使用字符 class 和 ] 后跟 [ 并使用 ' 不起作用

echo "[ad]" | grep -E '[\]\[]'

如果有人能解释一下它们之间的区别就太好了。

首先,始终引用 Regex 模式以防止 shell 事先解释:

$ echo "[ad]" | grep -E '(\[|\])'
[ad]

其次,在[]内用引号括起来,里面的[]不用转义,直接写在外面的[]:

$ echo "[ad]" | grep -E '[][]'
[ad]

也许您是故意提供了这样一个简单的示例(毕竟它是最小的),但万一您真正想要的只是检查方括号是否存在(一个固定的字符串,而不是正则表达式pattern),您可以将 grep-F/--fixed-strings 和多个 -e 选项一起使用:

$ echo "[ad]" | grep -F -e '[' -e ']'
[ad]

或者,fgrep 稍微短一点:

$ echo "[ad]" | fgrep -e '[' -e ']'
[ad]

或者,甚至:

$ echo "[ad]" | fgrep -e[ -e]
[ad]

你应该知道:

BRE(= 基本正则表达式)

ERE(= 扩展正则表达式)


BRE 元字符需要一个反斜杠来赋予它们特殊的含义,grep 基于

ERE 风格标准化了一种类似于 UNIX egrep 命令使用的风格。


关注-E-G

grep --help
Usage: grep [OPTION]... PATTERN [FILE]...
Search for PATTERN in each FILE or standard input.
PATTERN is, by default, a basic regular expression (BRE).
Example: grep -i 'hello world' menu.h main.c

Regexp selection and interpretation:
  -E, --extended-regexp     PATTERN is an extended regular expression (ERE)
  -F, --fixed-strings       PATTERN is a set of newline-separated strings
  -G, --basic-regexp        PATTERN is a basic regular expression (BRE)
  -P, --perl-regexp         PATTERN is a Perl regular expression
  ...
  ...

POSIX Basic Regular Expressions

POSIX Extended Regular Expressions

POSIX Bracket Expressions


而且您还应该了解 ,因为您的一些输入与 bash 解释器有关,而不是 grep 或其他任何东西

echo "[ad]" | grep -E (\[|\])

此处 假设您尝试使用 () 类似的东西:

echo $(( 10 * 10 ))

并通过使用单引号 ' 告诉 您不希望将其视为特殊运算符。所以

echo "[ad]" | grep -E '(\[|\])'

正确。