shell字符串处理
字符串长度
[plain]
shell>echo ${#string}
shell>expr length $string
shell>expr "$string" : '.*'
www.zhishiwu.com
匹配字符串开头的子串长度
[plain]
expr match "$string" '$substring'
$substring 是一个正则表达式.
expr "$string" : '$substring'
索引
[plain]
expr index $string $substring
提取子串
[plain]
${string:position}
在$string 中从位置$position开始提取子串.
如果$string 是"*"或者" @ ", 那么将会提取从位置$position开始的位置参数. [1]
${string:position:length} www.zhishiwu.com
在$string 中从位置$position开始提取$length 长度的子串.
[plain]
stringZ=abcABC123ABCabc
# 0123456789.....
# 0-based indexing.
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 注意,":"右边有一个空格!
# 这样, 它就可以工作了.
# 使用圆括号或者添加一个空格可以"转义"这个位置参数.
如果$string 参数是"*"或" @ ", 那么将会从$position位置开始提取 $length 个位置参数, 但是由于
可能没有$length 个位置参数了, 那么就有几个位置参数就提取几个位置参数.
[plain]
echo ${*:2} # 打印出第2个和后边所有的位置参数.
echo ${@:2} # 同上.
echo ${*:2:3} # 从第2个开始, 连续打印3个位置参数.
www.zhishiwu.com
expr substr $string $position $length
在$string 中从$position开始提取$length 长度的子串.
[plain]
echo `expr substr $stringZ 1 2`
echo `expr substr $stringZ 4 3`
expr match "$string" '/($substring/)'
从$string 的开始位置提取$substring , $substring 是正则表达式.
expr "$string" : '/($substring/)'
从$string 的开始位置提取$substring , $substring 是正则表达式.
[plain]
stringZ=abcABC123ABCabc
# =======
echo `expr match "$stringZ" '/(.[b-c]*[A-Z]..[0-9]/)'`
echo `expr "$stringZ" : '/(.[b-c]*[A-Z]..[0-9]/)'`
echo `expr "$stringZ" : '/(......./)'`
# 上边的每个echo 都打印出相同的结果. abcABC1
expr match "$string" '.*/($substring/)'
从$string 的结尾提取$substring , $substring 是正则表达式.
expr "$string" : '.*/($substring/)'
从$string 的结尾提取$substring , $substring 是正则表达式.
[plain]
expr match "$stringZ" '.*/([A-C][A-C][A-C][a-c]*/)'
ABCabc www.zhishiwu.com
expr "$stringZ" : '.*/(....../)'
ABCabc
子串削除
[plain]
${string#substring}
从$string 的开头位置截掉最短匹配的$substring .
${string##substring}
从$string 的开头位置截掉最长匹配的$substring .
${string%substring}
从$string 的结尾位置截掉最短匹配的$substring .
${string%%substring}
从$string 的结尾位置截掉最长匹配的$substring .
echo ${stringZ%b*c} # abcABC123ABCa
# 从$stringZ 的结尾位置截掉'b' 到'c' 之间最短的匹配.
echo ${stringZ%%b*c} #a
# 从$stringZ 的结尾位置截掉'b' 到'c' 之间最长的匹配.
当你需要构造文件名的时候, 这个操作就显得特别有用.
子串替换 www.zhishiwu.com
[plain]
${string/substring/replacement}
使用$replacement 来替换第一个匹配的$substring .
${string//substring/replacement}
使用$replacement 来替换所有匹配的$substring .
${string/#substring/replacement}
如果$substring 匹配$string 的开头部分, 那么就用$replacement 来替换$substring .
${string/%substring/replacement}
如果$substring 匹配$string 的结尾部分, 那么就用$replacement 来替换$substring
[从书本上摘录下来,对于字符串的处理,熟练运用了Bash提供的这些操作,一般的应用还是都能处理好]