1.计算字符串的长度
${#string}和expr length string
example
$ string="I love you"
$ echo "${#string}"
10
$ expr length $string (string 中含有空格会出现错误)
expr: syntax error
$ expr length "${string}"
10
2.字符串的索引
expr index $string $substring
命令的功能是在$string匹配$substring中字符第一次出现的位置
(我的理解是不是整体匹配$substring中的内容,而是一个字符一个字符的匹配,返回最小的index,没有的话,则返回0)
example
$ string="I love you"
$ substring="love"
$ expr index "$string" ${substring}
3
expr index "$string" ol (返回的是l的index)
3
3.字符串的开头匹配
expr match $string $substring
在string字符串的开头匹配substring字符串,返回匹配到的substring字符串的长度,若string开头匹配不到,返回0。substring 可以是正则式
example
$ string="I love you"
$ expr match "$string" o
0
$ expr match "$string" "I.\{3,\}"
10
$ expr match "$string" I.*
10
4.抽取子串
${string:position}
从string左边中position的位置开始抽取,string从第一个字符的位置为0。
${string: -position} == ${string:(-position)}
从string右边(尾部)抽取position个字符,两者等价,前条命令冒号和横线之间有空格
${string:position:length}
从string左边中position的位置开始抽取length个字符。
expr substr $string $position $length
从string中position位置抽取长度为length的串,string的position从1开始,与上面讲的position位置从0开始有区别。
example
$ string="I love you"
$ echo "${string:0}"I love you
$ echo "${string:0:6}"
I love
$ echo "${string: -6}" (:和-之间有空格)
ve you
$ echo "${string:-6}" (:和-之间没有空格)
I love you
$ expr substr "$string" 1 9
I love yo
$ expr substr "$string" 0 9
从0的话输出为空
上述只是简单的抽取子串,但是有时候不知到开始的字符或者结尾的字符有多长,所以需要正则表达式来 抽取开始或者的结尾的子串。
抽取开头
expr match $string '\(substring\)' 或者 expr $string : '\(substring\)'
expr match 返回的是长度,上面返回的是字符串,猜测与"\(\)"有关系。
$ string="family is very important"
$ expr match "$string" '\([a-z]*\)'
family
$ expr "$string" : "\([a-z]*\)"
family
抽取结尾
expr match $string '.*\(substring\)' 或者 expr $string : '.*\(substring\)'
与抽取开头相比只是多了 .*
$ expr match "$string" '.*\([a-z]\{9,\}\)'
important
5.删除子串
${string#substring} 删除string匹配开头处与substring匹配最短
${string##substring} 删除string匹配开头处与substring匹配最长
${string%substring} 删除string结尾处匹配与substring匹配最短
${string%%substring} 删除string结尾处匹配与substring匹配最长
substring并不是正则表达式,*只是有特殊含义表示起始符和终止符之间的任意字符。
$ string="familyyyy is very important"
$ echo ${string#f*y}
yyy is very important
$ echo ${string##f*y}
important
$ echo ${string%p*t}
familyyyy is very im
6.替换子串
${string/substring/replacement} 仅替换第一次与substring相匹配的子串
${string//substring/replacement} 替换所有与substring相匹配的子串
${string/#substring/replacement} 从string开头处与substring相匹配的替换
${string/%substring/replacement} 从string结尾处与substring相匹配的替换
substring并不是正则表达式,*只是有特殊含义表示起始符和终止符之间的任意字符。
$ string="20111asdfg30111"
$ echo "${string/111/2222}"
202222asdfg30111
$ echo "${string//111/2222}"
202222asdfg302222