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

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 #  假定行的长度小于$MINLEN所指定的长度的时候
  9 #+ 才认为此段结束.
 10
 11 while read line  # 提供和输入文件一样多的行...
 12 do
 13   echo "$line"   # 输入所读入的行本身.
 14
 15   len=${#line}
 16   if [ "$len" -lt "$MINLEN" ]
 17     then echo    # 在短行(译者注: 也就是小于$MINLEN个字符的行)后面添加一个空行.
 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语言中的strchr()函数非常相似.


提取子串

${string:position}
在$string中从位置$position开始提取子串.

如果$string是"*"或者"@", 那么将会提取从位置$position开始的位置参数. [1]

${string:position:length}
在$string中从位置$position开始提取$length长度的子串.


1 stringZ=abcABC123ABCabc
  2 #       0123456789.....
  3 #       0-based indexing.
  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 # 使用圆括号或者添加一个空格可以"转义"这个位置参数.
 24
 25 # 感谢, Dan Jacobson, 指出这点.
 


如果$string参数是"*"或"@", 那么将会从$position位置开始提取$length个位置参数, 但是由于可能没有$length个位置参数了, 那么就有几个位置参数就提取几个位置参数.


1 echo ${*:2}          # 打印出第2个和后边所有的位置参数.
  2 echo ${@:2}          # 同上.
  3
  4 echo ${*:2:3}        # 从第2个开始, 连续打印3个位置参数.
 


expr substr $string $position $length
在$string中从$position开始提取$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, $substring是正则表达式.

expr "$string" : '\($substring\)'
从$string的开始位置提取$substring, $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, $substring是正则表达式.

expr "$string" : '.*\($substring\)'
从$string的结尾提取$substring, $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

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

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