Bash已经支持了令人惊讶的字符串操作的数量。不幸地,这些工具缺乏统一的标准。一些是参数替换的子集,其它受到UNIX的expr命令的功能的影响。这导致不一致的命令语法和冗余的功能,但这些并没有引起混乱。
字符串长度
${#string}
expr length $string
expr "$string" : '.*' 1 stringZ=abcABC123ABCabc 2 3 echo ${#stringZ} # 15 4 echo `expr length $stringZ` # 15 5 echo `expr "$stringZ" : '.*'` # 15
--------------------------------------------------------------------------------
例子 9-10. 在一个文本文件的段落之间插入一个空白行
1 #!/bin/bash 2 # paragraph-space.sh 3 4 # 给单倍行距的文本文件段落之间插入一个空白行. 5 # Usage: $0 <FILENAME 6 7 MINLEN=45 # 可能需要改变这个值. 8 # Assume lines shorter than $MINLEN characters 9 #+ terminate a paragraph. 10 11 while read line # 提供和输入文件一样多的行... 12 do 13 echo "$line" # 输出行本身. 14 15 len=${#line} 16 if [ "$len" -lt "$MINLEN" ] 17 then echo # 在一个短行结束后打印一个空白行. 18 fi 19 done 20 21 exit 0
--------------------------------------------------------------------------------
匹配字符串开头的子串的长度
expr match "$string" '$substring' $substring 是一个正则表达式.
expr "$string" : '$substring' $substring 是一个正则表达式.
1 stringZ=abcABC123ABCabc 2 # |------| 3 4 echo `expr match "$stringZ" 'abc[A-Z]*.2'` # 8 5 echo `expr "$stringZ" : 'abc[A-Z]*.2'` # 8
索引
expr index $string $substring 在字符串$string中$substring第一次出现的数字位置
1 stringZ=abcABC123ABCabc 2 echo `expr index "$stringZ" C12` # 6 3 # C 字符的位置. 4 5 echo `expr index "$stringZ" 1c` # 3 6 # 'c' (in #3 position) matches before '1'.
这和C语言函数strchar()非常相似。
子串提取 ${string:position} 把$string中从第$postion个字符开始字符串提取出来.
如果$string是"*"或"@",则表示从位置参数中提取第$postion后面的字符串。[1]
${string:position:length} 把$string中$postion个字符后面的长度为$length的字符串提取出来。
1 stringZ=abcABC123ABCabc 2 # 0123456789..... 3 # 以0开始计算. 4 5 echo ${stringZ:0} # abcABC123ABCabc 6 echo ${stringZ:1} # bcABC123ABCabc 7 echo ${stringZ:7} # 23ABCabc 8 9 echo ${stringZ:7:3} # 23A 10 # 提取的子串长为3 11 12 13 14 # 有没有可能从字符串的右边结尾处提取? 15 16 echo ${stringZ:-4} # abcABC123ABCabc 17 # 默认是整个字符串,就相当于${parameter:-default}. 18 # 然而. . . 19 20 echo ${stringZ:(-4)} # Cabc 21 echo ${stringZ: -4} # Cabc 22 # 这样,它可以工作了. 23 # 圆括号或附加的空白字符可以转义$position参数. 24 25 # 多谢Dan Jacobson指出这点.
如果$string参数是"*"或"@",则会提取第$length个位置参数开始的共$length个参数。[译者注:实际取得的参数有可能少于$length,因为有可能余下的参数没有那么多了]
1 echo ${*:2} # 打印第二个位置以后的参数. 2 echo ${@:2} # 和上面一样. 3 4 echo ${*:2:3} # 打印从第二个参数起的三个位置参数.
expr substr $string $position $length 提取$string中从位置$postition开始的长度为$length的子字符串。
1 stringZ=abcABC123ABCabc 2 # 123456789...... 3 # 以1开始计算. 4 5 echo `expr substr $stringZ 1 2` # ab 6 echo `expr substr $stringZ 4 3` # ABC
expr match "$string" '\($substring\)' 从$string字符串左边开始提取提取由$substring描述的正则表达式的子串。
expr "$string" : '\($substring\)' 从$string字符串左边开始提取由$substring描述的正则表达式的子串。
1 stringZ=abcABC123ABCabc 2 # ======= 3 4 echo `expr match "$stringZ" '\(.[b-c]*[A-Z]..[0-9]\)'` # abcABC1 5 echo `expr "$stringZ" : '\(.[b-c]*[A-Z]..[0-9]\)'` # abcABC1 6 echo `expr "$stringZ" : '\(.......\)'` # abcABC1 7 # 上面的每个echo都打印相同的结果.
expr match "$string" '.*\($substring\)' 从$string字符串结尾开始提取由$substring描述的正则表达式的子串。
expr "$string" : '.*\($substring\)' 从$string字符串结尾开始提取由$substring描述的正则表达式的子串。
1 stringZ=abcABC123ABCabc 2 # ====== 3 4 echo `expr match "$stringZ" '.*\([A-C][A-C][A-C][a-c]*\)'` # ABCabc 5 echo `expr "$stringZ" : '.*\(......\)'` # ABCabc |