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

9.2. 操作字符串(2)

百度收藏 QQ搜藏

子串移动

${string#substring}
从$string左边开始,剥去最短匹配$substring子串.

${string##substring}
从$string左边开始,剥去最长匹配$substring子串.

   1 stringZ=abcABC123ABCabc
   2 #       |----|
   3 #       |----------|
   4
   5 echo ${stringZ#a*C}      # 123ABCabc
   6 # 剥去匹配'a'到'C'之间最短的字符串.
   7
   8 echo ${stringZ##a*C}     # abc
   9 # 剥去匹配'a'到'C'之间最长的字符串.
 


${string%substring}
从$string结尾开始,剥去最短匹配$substring子串。

${string%%substring}
从$string结尾开始,剥去最长匹配$substring子串。

   1 stringZ=abcABC123ABCabc
   2 #                    ||
   3 #        |------------|
   4
   5 echo ${stringZ%b*c}      # abcABC123ABCa
   6 # 从$stringZ后面尾部开始,剥去匹配'a'到'C'之间最短的字符串.
   7
   8 echo ${stringZ%%b*c}     # a
   9 # 从$stringZ后面尾部开始,剥去匹配'a'到'C'之间最长的字符串.
 

 

--------------------------------------------------------------------------------

例子 9-11. 随着文件名的更改来转换图形文件的格式

   1 #!/bin/bash
   2 #  cvt.sh:
   3 #  把一个目录下的所有MacPaint图像文件转换成"pbm"格式.
   4
   5 #  使用软件包"netpbm"中的"macptopbm"程序来转换,
   6 #+ 这个程序由Brian Henderson(bryanh@giraffe-data.com)维护.
   7 #  Netpbm是大多数Linux发行版的标准套件.
   8
   9 OPERATION=macptopbm
  10 SUFFIX=pbm          # 新的文件后缀.
  11
  12 if [ -n "$1" ]
  13 then
  14   directory=$1      # 如果一个目录名传递给脚本...
  15 else
  16   directory=$PWD    # 否则使用当前目录.
  17 fi 
  18  
  19 #  假定在目标目录中,
  20 #+ 都是带着".mac"后缀的MacPaint图像文件.
  21
  22 for file in $directory/*    # 文件名匹配符.
  23 do
  24   filename=${file%.*c}      #  剥掉文件名中的".mac"后缀,
  25                             #+ '.*c'匹配所有'.'和'c'之间所有的匹配字符
  26       
  27   $OPERATION $file > "$filename.$SUFFIX"
  28                             # 把结果重定向到新的文件中
  29   rm -f $file               # 转换后删除原来的文件.
  30   echo "$filename.$SUFFIX"  # 打印一条完成某文件的消息到标准输出.
  31 done
  32
  33 exit 0
  34
  35 # 练习:
  36 # --------
  37 #  依照现在的情况,这个脚本转换了目录下所有的文件
  38 #
  39 #  修改它,使它只转换后缀为".mac"的文件.
 

--------------------------------------------------------------------------------

一个简单的使用子串提取结构的getopt模仿。


--------------------------------------------------------------------------------

例子 9-12. 模仿getopt

   1 #!/bin/bash
   2 # getopt-simple.sh
   3 # 作者: Chris Morgan
   4 # 同意在ABS指南中使用.
   5
   6
   7 getopt_simple()
   8 {
   9     echo "getopt_simple()"
  10     echo "Parameters are '$*'"
  11     until [ -z "$1" ]
  12     do
  13       echo "Processing parameter of: '$1'"
  14       if [ ${1:0:1} = '/' ]
  15       then
  16           tmp=${1:1}               # 剥去前导字符'/' . . .
  17           parameter=${tmp%%=*}     # 提取参数名.
  18           value=${tmp##*=}         # 提取参数值.
  19           echo "Parameter: '$parameter', value: '$value'"
  20           eval $parameter=$value
  21       fi
  22       shift
  23     done
  24 }
  25
  26 # 把所有选项传给函数getopt_simple().
  27 getopt_simple $*
  28
  29 echo "test is '$test'"
  30 echo "test2 is '$test2'"
  31
  32 exit 0
  33
  34 ---
  35
  36 sh getopt_example.sh /test=value1 /test2=value2
  37
  38 Parameters are '/test=value1 /test2=value2'
  39 Processing parameter of: '/test=value1'
  40 Parameter: 'test', value: 'value1'
  41 Processing parameter of: '/test2=value2'
  42 Parameter: 'test2', value: 'value2'
  43 test is 'value1'
  44 test2 is 'value2'
 

--------------------------------------------------------------------------------

子串替换

${string/substring/replacement}
用$replacement替换由$substring匹配的字符串。

${string//substring/replacement}
用$replacement替换所有匹配$substring的字符串。

   1 stringZ=abcABC123ABCabc
   2
   3 echo ${stringZ/abc/xyz}           # xyzABC123ABCabc
   4                                   #用'xyz'代替第一个匹配的'abc'.
   5
   6 echo ${stringZ//abc/xyz}          # xyzABC123ABCxyz
   7                                   # 用'xyz'代替所有的'abc'.
 


${string/#substring/replacement}
如果$string字符串的最前端匹配$substring字符串,用$replacement替换$substring.

${string/%substring/replacement}
如果$string字符串的最后端匹配$substring字符串,用$replacement替换$substring.

   1 stringZ=abcABC123ABCabc
   2
   3 echo ${stringZ/#abc/XYZ}          # XYZABC123ABCabc
   4                                   # 用'XYZ'替换前端的'abc'.
   5
   6 echo ${stringZ/%abc/XYZ}          # abcABC123ABCXYZ
   7                                   # 用'XYZ'替换后端的'abc'.
 


9.2.1. 用awk处理字符串
Bash脚本可以调用awk的字符串操作功能来代替它自己内建的字符串操作符.


--------------------------------------------------------------------------------

例子 9-13. 提取字符串的另一种办法

   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} # position 3 (0-1-2), 4 characters long
  12                                          # skid
  13
  14 # 在awk中与Bash的${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

上一篇:9.2. 操作字符串(1) 下一篇:9.3. 参数替换

power by soyo123 2007-2008