专注各种脚本编程
Baidu
加入收藏夹
本站内容有下面分类知识,欢迎您的到来^_^
shell相关:指令篇 基础篇 脚本欣赏 编程实例 shell问问 shell视频教程 技巧篇 水平测试 E文资料 vi编辑器 高级Bash脚本编程指南
其他:mysql perl c语言 oracle
当前位置:| 主页>高级Bash脚本编程指南>

9.2. 操作字符串(1)

百度收藏 QQ搜藏

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

上一篇:9.1. 内部变量(2) 下一篇:9.2. 操作字符串(2)

power by soyo123 2007-2008