bash 3早就出来了, cygwin中也早就用上了, 却一直在处理正则表达式相关的任务时使用grep/sed/awk/perl之类, 没想到bash 3中已经有了内置的正则表达式支持, 不是那个简单的globbing啦, 是真正的regex(7)支持, 如:(测试的是 cygwin下的3.1.17(6)-release )
[[ "zhang wang li zhao" =~ "([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*)" ]]
echo ${BASH_REMATCH}
echo ${BASH_REMATCH[1]}
echo ${BASH_REMATCH[2]}
echo ${BASH_REMATCH[3]}
echo ${BASH_REMATCH[4]}
结果是:
zhang wang li zhao
zhang
wang
li
zhao
下面这个也是支持的:
[[ "zhang" =~ "z{1,8}" ]] && echo yes
可以省略后面的那个数字
[[ "zhang" =~ "z{1,}" ]] && echo yes
但不能省略前面的:
[[ "zhang" =~ "z{,8}" ]] && echo yes
这个命令就匹配失败了.
对于错误的正则表达式, 如:
[[ "zhang" =~ "[3" ]] && echo yes
或
[[ "zhang" =~ "*" ]] && echo yes
表面上看bash都是闷声不响的, 其实可以通过返回值为2检测出来, 如果是正则表达式本身正确但匹配失败, 返回的是1.
记得使用双份加厚的[[ 和 ]]哦, []是不行的.
===========================================================
今天使用[[ ]] 内的正则表达式时, 想当然地用
[[ "$PATH" !~ "some new path" ]] && ...
因为perl中 !~ 与 =~ 就是相反的语意, 但没想到bash不支持这个, 意外.
而且! 是特殊字符.
想达到取反的效果, 有下面两个变通的办法:
[[ ! "$PATH" =~ "some new path" ]] && PATH=$PATH:...
或
[[ "$PATH" =~ "some new path" ]] || PATH=$PATH:...
阅读(1483) | 评论(0) | 转发(0) |