10.1 字符串处理

Bash 支持的字符串操作数量达到了一个惊人的数目。但可惜的是,这些操作工具缺乏一个统一的核心。他们中的一些是参数代换的子集,另外一些则是 UNIX 下 expr 函数的子集。这将会导致语法前后不一致或者功能上出现重叠,更不用说那些可能导致的混乱了。

字符串长度

$

expr length $string

上面两个表达式等价于C语言中的 strlen() 函数。

expr "$string" : '.*'

stringZ=abcABC123ABCabc

echo ${#stringZ}                 # 15
echo `expr length $stringz`      # 15
echo `expr "$stringZ" : '.*'`    # 15

样例 10-1. 在文本的段落之间插入空行

#!/bin/bash
# paragraph-space.sh
# 版本 2.1,发布日期 2012年7月29日

# 在无空行的文本文件的段落之间插入空行。
# 像这样使用: $0 <FILENAME

MINLEN=60        # 可以试试修改这个值。它用来做判断。
#  假设一行的字符数小于 $MINLEN,并且以句点结束段落。
#+ 结尾部分有练习!

while read line  # 当文件有许多行的时候
do
  echo "$line"   # 输出行本身。

  len=${#line}
  if [[ "$len" -lt "$MINLEN" && "$line" =~ [*{\.}]$ ]]
# if [[ "$len" -lt "$MINLEN" && "$line" =~ \[*\.\] ]]
# 新版Bash将不能正常运行前一个版本的脚本。Ouch!
# 感谢 Halim Srama 指出这点,并且给出了修正版本。
    then echo    #  在该行以句点结束时,
  fi             #+ 增加一行空行。
done

exit

# 练习:
# -----
#  1) 该脚本通常会在文件的最后插入一个空行。
#+    尝试解决这个问题。
#  2) 在第17行仅仅考虑到了以句点作为句子终止的情况。
#+    修改以满足其他的终止符,例如 ?, ! 和 "。

起始部分字符串匹配长度

expr match "$string" '$substring'

其中,$substring 是一个正则表达式

expr "$string" : '$substring'

其中,$substring 是一个正则表达式。

索引

expr index $string $substring

返回在 $string 中第一个出现的 $substring 字符所在的位置。

几乎等价于C语言中的 strchr()

截取字符串(字符串分片)

${string:position}

$string 中截取自 $position 起的字符串。

如果参数 $string 是 "*" 或者 "@",那么将会截取自 $position 起的位置参数

${string:position:length}

$string 中截取自 $position 起,长度为 $length 的字符串。

其中,参数 positionlength 可以传入一个变量而不一定需要传入常量。

样例 10-2. 产生一个8个字符的随机字符串

如果参数 $string 是 "*" 或者 "@",那么将会截取自 $position 起,最大个数为 $length 的位置参数。

expr substr $string $position $length

$string 中截取自 $position 起,长度为 $length 的字符串。

expr match "$string" '\($substring\)'

$string 中截取自 $position 起的字符串,其中 $substring正则表达式

expr "$string" : '\($substring\)'

$string 中截取自 $position 起的字符串,其中 $substring 是正则表达式。

expr match "$string" '.*\($substring\)'

$string 结尾部分截取 $substring 字符串,其中 $substring 是正则表达式。

expr "$string" : '.*\($substring\)'

$string 结尾部分截取 $substring 字符串,其中 $substring 是正则表达式。

删除子串

${string#substring}

删除从 $string 起始部分起,匹配到的最短的 $substring

${string##substring}

删除从 $string 起始部分起,匹配到的最长的 $substring

${string%substring}

删除从 $string 结尾部分起,匹配到的最短的 $substring

例如:

${string%%substring}

删除从 $string 结尾部分起,匹配到的最长的 $substring

这个操作对生成文件名非常有帮助。

样例 10-3. 改变图像文件的格式及文件名

样例 10-4. 将流音频格式转换成 ogg 格式

下面是使用字符串截取结构对 getopt 的一个简单模拟。

样例 10-5. 模拟 getopt

子串替换

${string/substring/replacement}

替换匹配到的第一个 $substring$replacement

${string//substring/replacement}

替换匹配到的所有 $substring$replacement

${string/#substring/replacement}

替换 $string 中最前端匹配到的 $substring$replacement

${string/%substring/replacement}

替换 $string 中最末端匹配到的 $substring$replacement

Last updated

Was this helpful?