所以我试图在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 '[\]\[]'
如果有人可以解释它们之间的区别,那就太棒了。
答案 0 :(得分:4)
你应该知道:
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,因为您的一些输入与bash解释器无关grep
或其他任何内容
echo "[ad]" | grep -E (\[|\])
此处bash假设您尝试使用()
之类的内容:
echo $(( 10 * 10 ))
并使用单引号'
告诉bash您不希望它将其视为特殊运算符。所以
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]