现在的位置: 首页 > 综合 > 正文

Shell 中的 正则表达式

2018年05月01日 ⁄ 综合 ⁄ 共 1419字 ⁄ 字号 评论关闭
文章目录

    常接触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 的一些高级用法~

抱歉!评论已关闭.