Linux Shell脚本中如何自由操作字符串(2)

${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的结尾位置截掉'b'到'c'之间最短的匹配.
  7
  8 echo ${stringZ%%b*c}     # a
  9 # 从$stringZ的结尾位置截掉'b'到'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 #  假定目标目录中的所有文件都是MacPaint格式的图像文件,
 20 #+ 并且都是以".mac"作为文件名后缀.
 21
 22 for file in $directory/*    # 文件名匹配(filename globbing).
 23 do
 24   filename=${file%.*c}      #  去掉文件名的".mac"后缀
 25                             #+ ('.*c' 将会匹配
 26        #+ '.'和'c'之间任意字符串).
 27   $OPERATION $file > "$filename.$SUFFIX"
 28                             # 把结果重定向到新的文件中.
 29   rm -f $file               # 转换后删除原始文件.
 30   echo "$filename.$SUFFIX"  # 从stdout输出转换后文件的文件名.
 31 done
 32
 33 exit 0
 34
 35 # 练习:
 36 # -----
 37 #  就像它现在的样子, 这个脚本把当前
 38 #+ 目录下的所有文件都转换了.
 39 #  修改这个脚本, 让它只转换以".mac"为后缀名的文件.
 

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

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

例子 9-12. 将音频流文件转换为ogg各式的文件

1 #!/bin/bash
  2 # ra2ogg.sh: 将音频流文件(*.ra)转换为ogg格式的文件.
  3
  4 # 使用"mplayer"媒体播放器程序:
  5 #     
  6 #      可能需要安装合适的编解码程序(codec)才能够正常的运行这个脚本.
  7 # 需要使用"ogg"库和"oggenc":
  8 #     
  9
 10
 11 OFILEPREF=${1%%ra}      # 去掉"ra"后缀.
 12 OFILESUFF=wav           # wav文件的后缀.
 13 OUTFILE="$OFILEPREF""$OFILESUFF"
 14 E_NOARGS=65
 15
 16 if [ -z "$1" ]          # 必须要指定一个需要转换的文件名.
 17 then
 18   echo "Usage: `basename $0` [filename]"
 19   exit $E_NOARGS
 20 fi
 21
 22
 23 ##########################################################################
 24 mplayer "$1" -ao pcm:file=$OUTFILE
 25 oggenc "$OUTFILE"  # oggenc编码后会自动加上正确的文件扩展名.
 26 ##########################################################################
 27
 28 rm "$OUTFILE"      # 删除中介的*.wav文件.
 29                    # 如果你想保留这个文件的话, 可以把上边这行注释掉.
 30
 31 exit $?
 32
 33 #  注意:
 34 #  ----
 35 #  在网站上, 简单的在*.ram流音频文件上单击的话,
 36 #+ 一般都只会下载真正音频流文件(就是*.ra文件)的URL.
 37 #  你可以使用"wget"或者一些类似的工具
 38 #+ 来下载*.ra文件本身.
 39
 40
 41 #  练习:
 42 #  -----
 43 #  像上面所看到的, 这个脚本只能够转换*.ra文件.
 44 #  给这个脚本添加一些灵活性, 让它能够转换*.ram and other filenames.
 45 #
 46 #  如果你觉得这还不过瘾, 那么你可以扩展这个脚本,
 47 #+ 让它自动下载并转换音频流文件.
 48 #  给出一个URL, (使用"wget")批处理下载音频流文件,
 49 #+ 然后转换它们.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwswss.html