Grep正则表达式不使用方括号

时间:2017-07-09 09:16:08

标签: regex bash grep quoting

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

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

使用捕获组工作正常

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

使用不带'的捕获组会出现语法错误

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

使用带有[后跟]的字符类不会输出

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

]后跟[的字符类正常使用

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

使用]后跟[并使用'的字符类不起作用

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

如果有人可以解释它们之间的区别,那就太棒了。

3 个答案:

答案 0 :(得分:4)

你应该知道:

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 '(\[|\])'

是对的。

答案 1 :(得分:0)

首先,始终引用正则表达式模式以防止shell解释:

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

其次,在引号括起来的[]内,您无需转义[]内部,只需将它们写在外部[]内:

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

答案 2 :(得分:0)

也许你故意提供了这样一个简单的例子(毕竟,它是最小的),但万一你真正想要的是检查是否存在方括号(固定字符串,而不是正则表达式),您可以将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]