RobinLiew 2012-09-01
linux有很多命令可以对字符串进行操作,譬如awk,sed,但是在shell脚本如果能使用bash内建的操作符完成操作就尽量不要使用外部命令,因为外部命令通常都需要fork出一个单独的进程来执行,这会降低脚本执行效率;
1.获取字符串长度
bash语法:${#字符串}
$ str="hello world" $ echo ${#str} 11
我们用awk实现同样的功能
$ str="hello world" $ awk -v s="$str" 'BEGIN {print length(s)}' #注意$str两边的双引号不能省略 11
2.截取子串
bash语法:${字符串:positon}${字符串:positon:length}
bash中字符串下标从0开始,若不指定长度,默认截至的最后一个字符
$ str="abcdefghijk" $ echo "${str:2}" cdefghijk $ echo "${str:2:5}" cdefg
我们用awk实现同样的功能(awk中字符串下标从1开始):
$ str="abcdefghijk" $ awk -v s="$str" 'BEGIN {print substr(s,3)}' cdefghijk $ awk -v s="$str" 'BEGIN {print substr(s,3,5)}' cdefg
3.字符串替换
bash语法:${字符串/pattern/replacement}#使用$replacement来替换第一个匹配的$pattern${字符串//pattern/replacement}#使用$replacement来替换所有匹配的$pattern
注意:这里的pattern支持bash通配符(不支持正则)
$ str="a1b1c1" $ echo "${str/1/--}" a--b1c1 $ echo "${str//1/--}" a--b--c--
我们用awk实现同样的功能:
$ str="a1b1c1" $ awk -v s="$str" 'BEGIN {gsub("1","--",s); print s}' a--b--c--
关于字符串替换,还有2点要说明:
1.gsub支持正则(扩展正则),比如上面的例子我们还可以写成:awk-vs="$str"'BEGIN{gsub(/[0-9]+/,"--",s);prints}'
2.bash字符串替换还支持定址:
${字符串/#substring/replacement}#若substring出现在开头,则替换${字符串/%substring/replacement}#若substring出现在末尾,则替换
$ str="ba1b1c1" $ echo ${str/a/--} b--1b1c1 $ echo ${str/#a/--} ba1b1c1