Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2314139
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: LINUX

2008-07-08 00:29:51

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:...
阅读(1445) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~