字符串操作

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.

posted @ 2014-04-30 17:40  赵翔  阅读(162)  评论(0编辑  收藏  举报