您的位置:首页 > 运维架构 > Shell

shell下字符串的相关操作

2012-01-29 12:49 246 查看
计算字符串长度:

[shentao@vps ~]$ string=abcABC123ABCabc
[shentao@vps ~]$ echo ${#string}
15
[shentao@vps ~]$ echo `expr length $string`
15
[shentao@vps ~]$ echo `expr "$string" : '.*'`
15
感觉最后一种是很奇怪的写法。

匹配字符串开头的长度:

[shentao@vps ~]$ echo `expr match "$string" 'abc'`
3
[shentao@vps ~]$ echo `expr match "$string" 'bc'`  #字符串不以bc开头
0
[shentao@vps ~]$ echo `expr match "$string" 'abc[A-Z]*.2'`
8
[shentao@vps ~]$ echo `expr match "$string" 'abc[A-Z]*2'`
0


索引:

$ echo `expr index "$string" C`
6
$ echo `expr index "$string" '5'`
0
$ echo `expr index "$string" '51'`
7
$ echo `expr index "$string" '5a1'`
1
后两个语句的结果值得注意。

提取子串:

$ echo ${string:0}
abcABC123ABCabc
$ echo ${string:5}
C123ABCabc
$ echo ${string:5:2}
C1
$ echo ${string:-5} # 这样写不能按期望输出
abcABC123ABCabc
$ echo ${string: -5} #要在负数前加个空格
BCabc
$ echo ${string: (-5)} #或者把负数括起来
BCabc
$ echo ${string: -5:2}
BC
$ echo ${string: (-5):2}
BC

第二种提取子串的方法:

$ echo `expr substr $string 4 3`
ABC


从字符串开头位置提取子串:

$  echo `expr match "$string" '\(.[b-c]*[A-Z]..[0-9]\)'`
abcABC1
$ echo `expr "$string" : '\(.[b-c]*[A-Z]..[0-9]\)'`
abcABC1

$ echo `expr "$string" : '\([b-c]*[A-Z]..[0-9]\)'`   #$string不以[b-c]*开头,所以不匹配


从字符串结尾位置开始提取子串:

$ echo `expr match "$string" '.*\([A-C][A-C][A-C][a-c]*\)'`
ABCabc
$  echo `expr "$string" : '.*\(......\)'`
ABCabc
$ echo `expr match "$string" '.*\([A-C][A-C][A-C][a-c]\)'`   # 从尾部开始提取,但并不是一定要提取最尾部的字符,下面两个例子说明这个
ABCa
$ echo `expr match "$string" '.*\([A-C][A-C][A-C]\)'`
ABC
$ echo `expr match "$string" '.*\([1-3][A-C][A-C][A-C]\)'`
3ABC


从字符串开头位置截取子串(把匹配的子串删除):

$ echo ${string#a*C}  #最短匹配
123ABCabc
$ echo ${string#b*C}  # 字符串不是以b开头,所以不匹配
abcABC123ABCabc
$ echo ${string##a*C}   #最长匹配
abc
$ echo ${string#b*C}  # 字符串不是以b开头,所以不匹配
abcABC123ABCabc


从字符串尾部截取子串:

$ echo ${string%b*c}
abcABC123ABCa
$ echo ${string%%b*c}
a
$ echo ${string%b*C}  #字符串不以C结尾,所以不匹配
abcABC123ABCabc
$ echo ${string%%b*C}  #同上
abcABC123ABCabc


替换字符串中的子串:

$ echo ${string/abc/mmm}  # 替换第一个找到的字符串
mmmABC123ABCabc
$ echo ${string//abc/mmm}   # 替换所有找到的字符串
mmmABC123ABCmmm
$ echo ${string//ac/mmm}  #没有ac,所以不替换
abcABC123ABCabc
指定替换开头或者结尾处的子串:

$ echo ${string/#abc/mmm}   #如果匹配字符串开头处的子串,就替换
mmmABC123ABCabc
$ echo ${string/%abc/mmm}   #如果匹配字符串结尾处的子串,就替换
abcABC123ABCmmm
$ echo ${string/#bc/mmm}   #字符串不以bc开头,所以不替换
abcABC123ABCabc
$ echo ${string/%ab/mmm}   #字符串不以ab结尾,所以不替换
abcABC123ABCabc
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: