Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97235
  • 博文数量: 48
  • 博客积分: 1980
  • 博客等级: 上尉
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-16 15:03
文章分类

全部博文(48)

文章存档

2009年(48)

我的朋友
最近访客

分类:

2009-09-17 22:17:26

操作字符串
Bash所支持的字符串操作的数量多的令人惊讶. 但是缺乏统一的标准.
一些是参数替换的子集,
另外一些则受到UNIX expr命令的影响. 这就导致了命令语法的不一致, 还会引起冗余的功能, 但是这些并没有引起混乱.

1.字符串长度表示方法
  【格式1】${#string}
  【格式2】expr length $string
  【格式3】expr "$string" : '.*'
 
2.匹配字符串开头的子串长度
   【格式1】expr match "$string" '$substring' #$substring是一个正则表达式.
   【格式2】expr "$string" : '$substring'     #$substring是一个正则表达式.
   【示例】
         stringZ=abcABC123ABCabc
         echo `expr match "$stringZ" 'abc[A-Z]*.2'`   # 8
         echo `expr "$stringZ" : 'abc[A-Z]*.2'`       # 8
 
3.索引
   【格式1】expr index $string $substring
            #在字符串$string中所匹配到的$substring第一次所出现的位置.
   【示例】
          stringZ=abcABC123ABCabc
          echo `expr index "$stringZ" C12`             # 6 # C 字符的位置.

4.提取子串
   【格式1】${string:position}  #在$string中从位置$position开始提取子串.
    #如果$string是"*"或者"@", 那么将会提取从位置$position开始的位置参数. [1]
   【格式2】${string:position:length}#在$string中从位置$position开始提取$length长度的子串.
   【示例】
    stringZ=abcABC123ABCabc
    echo ${stringZ:0}                            # abcABC123ABCabc
    echo ${stringZ:1}                            # bcABC123ABCabc
    echo ${stringZ:7}                            # 23ABCabc
    echo ${stringZ:7:3}                          # 23A
       # 提取子串长度为3.
 
    # 能不能从字符串的右边(也就是结尾)部分开始提取子串?
    echo ${stringZ:(-4)}                         # Cabc
    echo ${stringZ: -4}                          # Cabc
    # 这样, 它就可以工作了.
    # 使用圆括号或者添加一个空格可以"转义"这个位置参数.

4.1正则表达式与提取
    【格式】expr match "$string" '\($substring\)'
            从$string的开始位置提取$substring, $substring是正则表达式.
    【格式】expr "$string" : '\($substring\)'
           从$string的开始位置提取$substring, $substring是正则表达式.
           echo `expr match "$stringZ" '\(.[b-c]*[A-Z]..[0-9]\)'`   # abcABC1
 
    【格式】expr match "$string" '.*\($substring\)'
            从$string的结尾提取$substring, $substring是正则表达式.
    【格式】expr "$string" : '.*\($substring\)'
            从$string的结尾提取$substring, $substring是正则表达式.
 
5.子串削除
   【格式1】${string#substring}
           从$string的开头位置截掉最短匹配的$substring.
   【格式2】${string##substring}
            从$string的开头位置截掉最长匹配的$substring.
   【示例】
           echo ${stringZ#a*C}      # 123ABCabc
           # 截掉'a'到'C'之间最短的匹配字符串.
           echo ${stringZ##a*C}     # abc
           # 截掉'a'到'C'之间最长的匹配字符串.

   【格式3】${string%substring}
           从$string的结尾位置截掉最短匹配的$substring.
   【格式4】${string%%substring}
           从$string的结尾位置截掉最长匹配的$substring.
 
6.子串替换
   【格式1】${string/substring/replacement}
           使用$replacement来替换第一个匹配的$substring.
   【格式2】${string//substring/replacement}
           使用$replacement来替换所有匹配的$substring.
   【格式3】${string/#substring/replacement}
            如果$substring匹配$string的开头部分, 那么就用$replacement来替换$substring.
   【格式4】${string/%substring/replacement}
            如果$substring匹配$string的结尾部分, 那么就用$replacement来替换$substring.
 
7.使用awk来处理字符串
Bash脚本也可以调用awk的字符串操作功能来代替它自己内建的字符串操作.
【示例】提取字符串的另一种方法
  1 #!/bin/bash
  2 # substring-extraction.sh
  3
  4 String=23skidoo1
  5 #      012345678    Bash
  6 #      123456789    awk
  7 # 注意不同的字符串索引系统:
  8 # Bash的第一个字符是从'0'开始记录的.
  9 # Awk的第一个字符是从'1'开始记录的.
 10
 11 echo ${String:2:4} # 位置 3 (0-1-2), 4 个字符长
 12                                          # skid
 13
 14 # awk中等价于${string:pos:length}的命令是substr(string,pos,length).
 15 echo | awk '
 16 { print substr("'"${String}"'",3,4)      # skid
 17 }
 18 '
 19 #  使用一个空的"echo"通过管道传递给awk一个假的输入,
 20 #+ 这样就不必提供一个文件名给awk.
 21
 22 exit 0
 
阅读(503) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~