首页 > 代码库 > 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 中的 正则表达式