当前位置:

grep 正则表达式 匹配 括号

访客 2024-01-05 1232 0

grep正则表达式如何匹配中括号?
Howgrepregexmatchessquarebrackets?

1.匹配中括号,例如匹配String[]args

$echo"String[]args"|grep-Eo"[][0-9a-zA-Z]"String[]args(这一行是匹配到的结果)

(1)grep-E加上-E表示采用正则表达式进行匹配。加-o参数,表示只输出匹配到的部分。
(2)正则表达式中,表示Characterclass(字符组)的中括号:即下面例子中最外层的中括号,例如[0-9]匹配一个或多个0到9的数字,[0-9a-z]匹配一个或多个0到9、小a到小z的字符。
(3)在字符组中使用中括号,也就是说在中括号里还有中括号。匹配中括号[]时,需要把中括号放到字符组的最前面,且]在前,[在后。(如下面例子中的[][0-9a-zA-Z]

echo"String[]args"|grep-E"[[]0-9a-zA-Z]"这样是不匹配String[]args的。

[可以匹配到左中括号,例如,这种形式[0-9a-zA-Z[]可以匹配到左中括号,无法匹配右中括号:

$echo"String[]args"|grep-Eo"[0-9a-zA-Z[]"String[(这一行是匹配到的结果)args(这一行是匹配到的结果)

说明:加-o参数,表示只输出匹配到的部分。可以看到只匹配到了String[,没有右中括号。

其他情况的输出结果:

$echo"String[]args"|grep-Eo"[0-9a-zA-Z[]]"[](这一行是匹配到的结果)

说明:这个正则表达式[0-9a-zA-Z[[]]实际被解释为[0-9a-zA-Z[[]]了。[0-9a-zA-Z[[]匹配左中括号,接着是]匹配右中括号。

$echo"String[]args"|grep-Eo"[]0-9a-zA-Z[]"String[]args(这一行是匹配到的结果)

说明:[]0-9a-zA-Z[]是可以匹配String[]args的,需要把]放到最前面。[放到后面也可以。

注意:一定要加-o参数。

2.匹配大括号,例如匹配{abc123}

大括号{}在中括号中没有顺序关系。也不用必须放在中括号的最前面。
这几种形式都可以:[}{0-9a-zA-Z][{}0-9a-zA-Z][0-9a-zA-Z{}][0-9a-zA-Z}{]

$echo"{abc123}"|grep-Eo"[}{0-9a-zA-Z]"{abc123}(这一行是匹配的结果)$echo"{abc123}"|grep-Eo"[{}0-9a-zA-Z]"{abc123}(这一行是匹配的结果)

3.同时匹配中括号和大括号,例如匹配newbyte[]{6,55,73,72,0,0x60,0x77}

[][}{0-9a-zA-Z,][][{}0-9a-zA-Z,][]}{0-9a-zA-Z[,][]}{0-9a-zA-Z,[][]0-9a-zA-Z[,{}][]0-9a-zA-Z,{}[]都可以。
中括号中的]在前,[在后,即][
大括号{}先后没有关系。

$echo"newbyte[]{6,55,73,72,0,0x60,0x77}"|grep-Eo"[][}{0-9a-zA-Z,]"newbyte[]{6,55,73,72,0,0x60,0x77}(这一行是匹配的结果)$echo"newbyte[]{6,55,73,72,0,0x60,0x77}"|grep-Eo"[][{}0-9a-zA-Z,]"newbyte[]{6,55,73,72,0,0x60,0x77}(这一行是匹配的结果)$echo"newbyte[]{6,55,73,72,0,0x60,0x77}"|grep-Eo"[]}{0-9a-zA-Z[,]"newbyte[]{6,55,73,72,0,0x60,0x77}

4.总结

(1)匹配字符组中的中括号时(中括号里的中括号),]需要在最前面,[的位置可以放在中间或者最后面。
(2)用[或者[[都可以匹配左中括号。
(3)匹配字符组中的大括号,此时大括号没有特殊含义,所以{}的位置可以随意一些(但不要破坏其他区间)。

5.参考

https://stackoverflow.com/questions/30044199/how-can-i-match-square-bracket-in-regex-with-grep

[…]Ifabracketexpressionspecifiesboth‘-’and‘]’,the‘]’shallbeplacedfirst(afterthe‘^’,ifany)andthe‘-’lastwithinthebracketexpression.
Therefore,yourregexshouldbe:
echo"fdsl[]"|grep-Eo"[][a-z]"

发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~