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

Pra*_*pta 3 regex bash grep quoting

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

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

使用捕获组工作正常

echo "[ad]" | grep -E '(\[|\])'
[ad]
Run Code Online (Sandbox Code Playgroud)

使用捕获组而不'给出语法错误

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

使用字符类[后跟]不提供任何输出

echo "[ad]" | grep -E [\[\]]
Run Code Online (Sandbox Code Playgroud)

使用字符类]后跟[正常工作

echo "[ad]" | grep -E [\]\[]
[ad]
Run Code Online (Sandbox Code Playgroud)

使用带有]后跟[和使用的字符类'不起作用

echo "[ad]" | grep -E '[\]\[]'
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*iri 5

你应该知道:

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
  ...
  ...
Run Code Online (Sandbox Code Playgroud)

POSIX Basic Regular Expressions

POSIX Extended Regular Expressions

POSIX Bracket Expressions


而且您还应该了解,因为您的某些输入与 bash 解释器无关grep或其他任何内容

echo "[ad]" | grep -E (\[|\])
Run Code Online (Sandbox Code Playgroud)

这里假设您尝试使用以下内容()

echo $(( 10 * 10 ))
Run Code Online (Sandbox Code Playgroud)

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

echo "[ad]" | grep -E '(\[|\])'
Run Code Online (Sandbox Code Playgroud)

是正确的。