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)
如果有人能解释它们之间的区别,那就太好了。
你应该知道:
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 ExpressionsPOSIX Extended Regular ExpressionsPOSIX Bracket Expressions而且您还应该了解bash,因为您的某些输入与 bash 解释器无关grep或其他任何内容
echo "[ad]" | grep -E (\[|\])
Run Code Online (Sandbox Code Playgroud)
这里bash假设您尝试使用以下内容():
echo $(( 10 * 10 ))
Run Code Online (Sandbox Code Playgroud)
并通过使用单引号'告诉bash您不希望它被视为它的特殊运算符。所以
echo "[ad]" | grep -E '(\[|\])'
Run Code Online (Sandbox Code Playgroud)
是正确的。