1 正则表达式字符介绍
参考 正则表达式手册
2 常用符号演示
在线测试网址 http://tool.chinaz.com/regex/
^
匹配输入字符串的开始位置
*
匹配前面的子表达式零次或多次
{n,m}
m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次
[a-z]
字符范围,也有[0-9]等
3 实例演示
实例1
要处理的需求:匹配SCC_VID_COLOR_SYS_XXX,然后在其后面增加一个字符串YYY
- 步骤1:找到指定位置
讲解:
字段 | SYS | (_[A-Z]{1,}){1,2} | (_[0-9]{1,}){0,}, |
---|---|---|---|
讲解 | SYS字符串 | (_+大写字母+至少一个)+这样的结构一或两个 | (_+数字+至少一个)+这样的结构没有或者有 |
更精简的写法:SYS(_[A-Z0-9]*){1,}
- 步骤2:替换内容
下面这样写,结果不符合预期
这里要引入分组方法,在正则表达式里面用小括号()代表一个组,在替换的时候使用\1、\2代表第一个第二个分组。(有些工具使用\n,有些使用$n代表),下面这样写才对
- 转化为代码正则
如果是代码里面需要写正则表达式,那么还是刚才那个在线工具,就能把正则转换为不同语言的代码http://tool.chinaz.com/tools/regexgenerate,当然熟练的也可以自己直接写。
实例2
原数据:
Attr Name=“SW_PowerCurrent” Alias=“SW_PowerCurrent” Ids=“0” Atoms=“100”
要求:这种行,把最后的100换成0
最终ok的shell脚本
sed -i -r “s/(SW_PowerCurrent.Atoms=").(”)/\10\2/" $xxx/cvte_ocsxml.xml
这里有几个坑:
1、前面()的集合,后面要用的时候不能用$1,要用/1
2、用了/1和/2之后,会报错\2 on `s’ command’s RHS,原因是之前只用了sed -i,需要增加-r
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)