1. 字符串长度: ${#string}, expr length $string, expr "$string" : '.*'
stringZ=abcABC123ABCabc
echo ${#stringZ} # 15
echo `expr length $stringZ` # 15
echo `expr "$stringZ" : '.*'` # 15
2. 匹配字符串开头的子串长度: expr match "$string" '$substring' ;expr "$string" : '$substring' $substring是一个正则表达式.
stringZ=abcABC123ABCabc
echo `expr match "$stringZ" 'abc[A-Z]*.2'` # 8
echo `expr "$stringZ" : 'abc[A-Z]*.2'` # 8
3. 索引: expr index $string $substring index下标从1开始
stringZ=abcABC123ABCabc, echo `expr index "$stringZ" C12` # C 字符的位置.
注意: index其实查找的是字串中的包含的任意字符在$tring中第一次出现的位置。没有返回0.
4. 提取子串: 下标从0开始
${string:position}在$string中从位置$position开始提取子串. 如果$string是"*"或者"@", 那么将会提取从位置$position开始的位置参数.从0开始
${string:position:length}, 在$string中从位置$position开始提取$length长度的子串.如果$string参数是"*"或"@", 那么将会从$position位置开始提取$length个位置参数, 但是由于可能没有$length个位置参数了, 那么就有几个位置参数就提取几个位置参数.
stringZ=abcABC123ABCabc
echo ${stringZ:0} # abcABC123ABCabc
echo ${stringZ:1} # bcABC123ABCabc
echo ${stringZ:7} # 23ABCabc
echo ${stringZ:7:3} # 23A 提取子串长度为3.
# 能不能从字符串的右边(也就是结尾)部分开始提取子串?
echo ${stringZ:-4} # abcABC123ABCabc # 默认是提取整个字符串, 就象${parameter:-default}一样.
echo ${stringZ:(-4)} # Cabc
echo ${stringZ: -4} # Cabc 这样, 它就可以工作了. 使用圆括号或者添加一个空格可以"转义"这个位置参数.
5. expr substr $string $position $length 在$string中从$position开始提取$length长度的子串. # 以1开始计算.
stringZ=abcABC123ABCabc
# 123456789......
echo `expr substr $stringZ 1 2` # ab
echo `expr substr $stringZ 4 3` # ABC
expr match "$string" '($substring)' 从$string的开始位置提取$substring, $substring是正则表达式.
expr "$string" : '($substring)' 从$string的开始位置提取$substring, $substring是正则表达式.
echo `expr match "$stringZ" '(.[b-c]*[A-Z]..[0-9])'` # abcABC1
echo `expr "$stringZ" : '(.[b-c]*[A-Z]..[0-9])'` # abcABC1
echo `expr "$stringZ" : '(.......)'` # abcABC1
expr match "$string" '.*($substring)' 从$string的结尾提取$substring, $substring是正则表达式.
expr "$string" : '.*($substring)' 从$string的结尾提取$substring, $substring是正则表达式.
echo `expr match "$stringZ" '.*([A-C][A-C][A-C][a-c]*)'` #ABCabc
echo `expr "$stringZ" : '.*(......)'` #ABCabc
6. 子串削除
${string#substring}从$string的开头位置截掉最短匹配的$substring.
${string##substring}从$string的开头位置截掉最长匹配的$substring.
${string%substring}从$string的结尾位置截掉最短匹配的$substring.
${string%%substring}从$string的结尾位置截掉最长匹配的$substring.
stringZ=abcABC123ABCabc
echo ${stringZ#a*C} # 123ABCabc # 截掉'a'到'C'之间最短的匹配字符串.
echo ${stringZ##a*C} # abc # 截掉'a'到'C'之间最长的匹配字符串.
echo ${stringZ%b*c} # abcABC123ABCa 从$stringZ的结尾位置截掉'b'到'c'之间最短的匹配.
echo ${stringZ%%b*c} # a # 从$stringZ的结尾位置截掉'b'到'c'之间最长的匹配.
7. 子串替换
${string/substring/replacement}使用$replacement来替换第一个匹配的$substring.
${string//substring/replacement}使用$replacement来替换所有匹配的$substring
echo ${stringZ/abc/xyz} # xyzABC123ABCabc # 使用'xyz'来替换第一个匹配的'abc'.
echo ${stringZ//abc/xyz} # xyzABC123ABCxyz # 用'xyz'来替换所有匹配的'abc'.
${string/#substring/replacement}如果$substring匹配$string的开头部分, 那么就用$replacement来替换$substring.
${string/%substring/replacement}如果$substring匹配$string的结尾部分, 那么就用$replacement来替换$substring.
stringZ=abcABC123ABCabc
echo ${stringZ/#abc/XYZ} # XYZABC123ABCabc # 用'XYZ'替换开头的'abc'.
echo ${stringZ/%abc/XYZ} # abcABC123ABCXYZ # 用'XYZ'替换结尾的'abc'.
AWK
Bash脚本也可以调用awk的字符串操作功能来代替它自己内建的字符串操作.
String=23skidoo1
# 012345678 Bash
# 123456789 awk
# 注意不同的字符串索引系统:Bash的第一个字符是从'0'开始记录的. Awk的第一个字符是从'1'开始记录的.
echo ${String:2:4} # 位置 3 (0-1-2), 4 个字符长 # skid
# awk中等价于${string:pos:length}的命令是substr(string,pos,length).
15 echo | awk ' { print substr("'"${String}"'",3,4) # skid } '
# 使用一个空的"echo"通过管道传递给awk一个假的输入, 这样就不必提供一个文件名给awk.