如何将正则表达式中的方括号与grep匹配?

Jah*_*hid 13 regex bash grep

我试图匹配两者[]grep,但只是成功匹配[.无论我如何尝试,我似乎无法正确匹配].

这是一个代码示例:

echo "fdsl[]" | grep -o "[ a-z]\+" #this prints fdsl
echo "fdsl[]" | grep -o "[ \[a-z]\+" #this prints fdsl[
echo "fdsl[]" | grep -o "[ \]a-z]\+" #this prints nothing
echo "fdsl[]" | grep -o "[ \[\]a-z]\+" #this prints nothing
Run Code Online (Sandbox Code Playgroud)

编辑:我需要这样做的原始正则表达式是这样的:

echo "fdsl[]" | grep -o "[ \[\]\t\na-zA-Z\/:\.0-9_~\"'+,;*\=()$\!@#&?-]\+" 
#this prints nothing
Run Code Online (Sandbox Code Playgroud)

注意:我已经尝试过这篇文章中的所有答案,但这不适用于这个特殊情况.我需要在里面使用这些括号[].

nha*_*tdh 12

根据POSIX正则表达式规范的BRE/ERE Bracketed Expression部分:

  1. [...]右括号(']')将失去其特殊含义,如果它首先出现在列表中(在最初的circumflex('^')之后,如果有的话),则表示自己在括号表达式中.否则,它将终止括号表达式,除非它出现在整理符号(例如"[.].]")中,或者是整理符号,等价类或字符类的结束右括号.特殊字符'.','*','[',和'\'(周期,星号,左括号和反斜杠,分别地)应在括号表达式中失去其特殊的意义.

  1. [...]如果括号表达式同时指定了'-'']',']'则应在括号表达式中首先放置('^'如果有的话)和'-'最后一个.

因此,你的正则表达式应该是:

echo "fdsl[]" | grep -Eo "[][ a-z]+"
Run Code Online (Sandbox Code Playgroud)

请注意该E标志,它指定使用支持+量词的ERE .+BRE(默认模式)不支持量词.

Mike Holt对"[][a-z ]\+"逃逸的解决方案的解决方案是+因为它运行在GNU grep上,它扩展了语法以支持\+重复一次或多次.根据POSIX标准,它实际上是未定义的行为(这意味着实现可以提供有意义的行为并记录它,或者抛出语法错误,或者其他).

如果您认为您的代码只能在GNU环境中运行,那么使用Mike Holt的答案就完全没问题了.使用sed为例,你被卡住BRE当您使用POSIXsed(无标志切换到ERE),它的繁琐与POSIX BRE,其中唯一的定义量词是写即使是简单的正则表达式*.

原始正则表达式

请注意,grep逐行使用输入文件,然后检查该行是否与正则表达式匹配.因此,即使您使用P原始正则表达式的标志,\n也总是多余的,因为正则表达式不能跨行匹配.

虽然可以匹配没有 P标志的水平标签,我认为使用P标志来执行此任务更自然.

鉴于此输入:

$ echo -e "fds\tl[]kSAJD<>?,./:\";'{}|[]\\!@#$%^&*()_+-=~\`89"
fds     l[]kSAJD<>?,./:";'{}|[]\!@#$%^&*()_+-=~`89
Run Code Online (Sandbox Code Playgroud)

问题中的原始正则表达式几乎没有修改(最后是unescape +):

$ echo -e "fds\tl[]kSAJD<>?,./:\";'{}|[]\\!@#$%^&*()_+-=~\`89" | grep -Po "[ \[\]\t\na-zA-Z\/:\.0-9_~\"'+,;*\=()$\!@#&?-]+"
fds     l[]kSAJD
?,./:";'
[]
!@#$
&*()_+-=~
89
Run Code Online (Sandbox Code Playgroud)

虽然我们可以删除\n(因为它是多余的,如上所述),以及一些其他不必要的转义:

$ echo -e "fds\tl[]kSAJD<>?,./:\";'{}|[]\\!@#$%^&*()_+-=~\`89" | grep -Po "[ \[\]\ta-zA-Z/:.0-9_~\"'+,;*=()$\!@#&?-]+"
fds     l[]kSAJD
?,./:";'
[]
!@#$
&*()_+-=~
89
Run Code Online (Sandbox Code Playgroud)


小智 6

一个问题是[表达式中的特殊字符,它不能被转义\(至少不是我的grep风格).解决方案就是定义它[[].