首页 > 代码库 > Shell 中的 正则表达式

Shell 中的 正则表达式

    常接触shell脚本语言的,经常会看到一个shell命令接一堆乱七八糟的option,类似这样的 sed -e "s/^[^\-]*-//"  ,虽然知道那肯定是一个逻辑条件组合,但是如果不是熟悉正则表达式的人,绝对看的眼花.

这里学习记录一下正则表达式的一些基本用法.


                                                 撰写不易,转载需注明出处:http://blog.csdn.net/jscese/article/details/41645025#t7

概念:

 正则表达式也叫正规表示法,就是处理字符串的方法,他是以行为单位进行字符串癿处理行为, 正则表示法透过一些特殊符号的辅助,

可以让使用者轻易的达到  搜寻  删除  取代』某特定字符串的处理程序!



使用:

grep 摘取命令为例

搜寻特定字符串:

 grep -n  ‘jscese’ test.txt

以单引号包含需要搜索的字符串,

单双引号的区别在于,单引号里面的内容全当字符处理,如果里面是其它变量名,也只当作普通字符,二双引号就不同,具有引用特性



利用中括号 [] 搜寻集合字符:

grep -n  'j[sc]ese'  test.txt

中括号代表一个字符, 所以上面的语句代表会 搜索 jsese  jcese 这两种组合可能.




取反“ ^ ”:

grep  -n  ‘j[^s]cese'  test.txt   //取中间不是 s 的

grep  -n  'j[^a-zA-Z0-9]cese  test.txt     //取中间不是a-z A-Z 0-9 的,只有是特殊符号的才行了

grep  -n  '^jscese'   test.txt      //代表开头 ,取以jscese开头的行


使用 ^  在中括号[] 里面和外面代表的意义是不一样的,在里面代表取反,在外面代表行首




行尾 " $ ":

grep   -v  '^$'   test.txt    //取非空的行

行首^直接加行尾$,代表空的一行,-v 就是取非匹配的




任意一个字符 " . " 与重复字符 " * ":

grep   -n    'j....e'   test.txt   // 其中每个  .  代表任意的一个字符

grep   -n    ‘j*’  test.txt   // 这个会列出所有的 ,因为 * 代表重复前面的字符 0 次 或者 无数 次, 也就是可能是空

修饰前一个字符



限定连续 字符范围 {}:

grep  -n   ‘js\{2,\}'   test.txt        // {} 需要跳脱字符转义 所以在前面加上 \

也是修饰前一个字符的,这里代表找以js开头后面紧接着2个以上s 的一行,\{2,6\} 就代表2到6个之间的都符合



基本的规则就是上面的这些了,详细的可以去看鸟哥的私房菜,现在来看看开头的 sed -e "s/^[^\-]*-//"

这个是在envsetup,sh 中用来取源码编译类型的,lunch选取的值为 selection= full_x86-eng 的样式

通过:

local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")

可以看到 通过sed命令直接进行编辑,利用sed的 s 取代动作,后面的模式为:

“s/要被取代的部分/取代的字符串/“

可以看到  要被取代的部分为 :  ^[^\-]*-   这代表从头开始,0个或者多个 非 - 的字符然后以 - 字符结尾的部分, 因为在[]中 - 具有范围的意义,所以加了跳脱字符 \

取代部分这里是空的

所以最后实际上是把   full-x86- 给剔除掉了,余下eng 赋值给 variant ,这就是工程机的编译模式.


到这里正则表达式的入门基本算是完成了,后面有机会分析sed 以及awk 的一些高级用法~





Shell 中的 正则表达式