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,因为您的一些输入与 bash 解释器有关,而不是 grep
或其他任何东西
echo "[ad]" | grep -E (\[|\])
此处 bash 假设您尝试使用 ()
类似的东西:
echo $(( 10 * 10 ))
并通过使用单引号 '
告诉 bash 您不希望将其视为特殊运算符。所以
echo "[ad]" | grep -E '(\[|\])'
正确。
所以我试图在 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,因为您的一些输入与 bash 解释器有关,而不是 grep
或其他任何东西
echo "[ad]" | grep -E (\[|\])
此处 bash 假设您尝试使用 ()
类似的东西:
echo $(( 10 * 10 ))
并通过使用单引号 '
告诉 bash 您不希望将其视为特殊运算符。所以
echo "[ad]" | grep -E '(\[|\])'
正确。