字符串长度
shell>echo ${#string} shell>expr length $string shell>expr "$string" : '.*'
匹配字符串开头的子串长度
expr match "$string" '$substring' $substring 是一个正则表达式. expr "$string" : '$substring'
索引
expr index $string $substring
提取子串
${string:position} 在$string 中从位置$position开始提取子串. 如果$string 是"*"或者" @ ", 那么将会提取从位置$position开始的位置参数. [1] ${string:position:length} 在$string 中从位置$position开始提取$length 长度的子串.
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 个位置参数了, 那么就有几个位置参数就提取几个位置参数.
echo ${*:2} # 打印出第2个和后边所有的位置参数. echo ${@:2} # 同上. echo ${*:2:3} # 从第2个开始, 连续打印3个位置参数.
expr substr $string $position $length
在$string 中从$position开始提取$length 长度的子串.
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 是正则表达式.
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 是正则表达式.
expr match "$stringZ" '.*\([A-C][A-C][A-C][a-c]*\)' ABCabc expr "$stringZ" : '.*\(......\)' ABCabc
子串削除
${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' 之间最长的匹配.
另: 关于子串削除,分享一个小例子:
[root@lin2 shell]$aa="/root/aaa/aaa" #当然,根据需求,此处还可以用 "dirname"实现! [root@lin2 shell]$echo ${aa%/[a-z]+} #应该是echo支持的正则有效?还是这个子串削除的原因!除了"+"的匹配,还有"."貌似也不支持额… /root/aaa/aaa [root@lin2 shell]$echo ${aa%/[a-z]*} /root/aaa当你需要构造文件名的时候, 这个操作就显得特别有用.
再分享一个哈【转】:
#!/bin/bash num=1 for i in *.tar *.tar.gz do new=new_$num.${i#*.} mv $i $new 2>/dev/null if [ $? -eq 0 ];then echo "remove $i to $new" let num++ fi done
# touch test{1..5}.tar test{1..5}.tar.gz
# ls
test1.tar test2.tar test3.tar test4.tar test5.tar test.sh
test1.tar.gz test2.tar.gz test3.tar.gz test4.tar.gz test5.tar.gz
# ./test.sh
remove test1.tar to new_1.tar
remove test2.tar to new_2.tar
remove test3.tar to new_3.tar
remove test4.tar to new_4.tar
remove test5.tar to new_5.tar
remove test1.tar.gz to new_6.tar.gz
remove test2.tar.gz to new_7.tar.gz
remove test3.tar.gz to new_8.tar.gz
remove test4.tar.gz to new_9.tar.gz
remove test5.tar.gz to new_10.tar.gz
#
子串替换
${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提供的这些操作,一般的应用还是都能处理好]
[“无他,唯手熟尔”]