10.1 字符串处理
Bash 支持的字符串操作数量达到了一个惊人的数目。但可惜的是,这些操作工具缺乏一个统一的核心。他们中的一些是参数代换的子集,另外一些则是 UNIX 下 expr 函数的子集。这将会导致语法前后不一致或者功能上出现重叠,更不用说那些可能导致的混乱了。
字符串长度
$
$expr length $string
expr length $string上面两个表达式等价于C语言中的 strlen() 函数。
expr "$string" : '.*'
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'
expr match "$string" '$substring'其中,$substring 是一个正则表达式。
expr "$string" : '$substring'
expr "$string" : '$substring'其中,$substring 是一个正则表达式。
索引
expr index $string $substring
expr index $string $substring返回在 $string 中第一个出现的 $substring 字符所在的位置。
几乎等价于C语言中的 strchr()。
截取字符串(字符串分片)
${string:position}
${string:position}在 $string 中截取自 $position 起的字符串。
如果参数 $string 是 "*" 或者 "@",那么将会截取自 $position 起的位置参数。
${string:position:length}
${string:position:length}在 $string 中截取自 $position 起,长度为 $length 的字符串。
其中,参数 position 与 length 可以传入一个变量而不一定需要传入常量。
样例 10-2. 产生一个8个字符的随机字符串
如果参数 $string 是 "*" 或者 "@",那么将会截取自 $position 起,最大个数为 $length 的位置参数。
expr substr $string $position $length
expr substr $string $position $length在 $string 中截取自 $position 起,长度为 $length 的字符串。
expr match "$string" '\($substring\)'
expr match "$string" '\($substring\)'在 $string 中截取自 $position 起的字符串,其中 $substring 是正则表达式。
expr "$string" : '\($substring\)'
expr "$string" : '\($substring\)'在 $string 中截取自 $position 起的字符串,其中 $substring 是正则表达式。
expr match "$string" '.*\($substring\)'
expr match "$string" '.*\($substring\)'从 $string 结尾部分截取 $substring 字符串,其中 $substring 是正则表达式。
expr "$string" : '.*\($substring\)'
expr "$string" : '.*\($substring\)'从 $string 结尾部分截取 $substring 字符串,其中 $substring 是正则表达式。
删除子串
${string#substring}
${string#substring}删除从 $string 起始部分起,匹配到的最短的 $substring。
${string##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}
${string/substring/replacement}替换匹配到的第一个 $substring 为 $replacement。
${string//substring/replacement}
${string//substring/replacement}替换匹配到的所有 $substring 为 $replacement。
${string/#substring/replacement}
${string/#substring/replacement}替换 $string 中最前端匹配到的 $substring 为 $replacement。
${string/%substring/replacement}
${string/%substring/replacement}替换 $string 中最末端匹配到的 $substring 为 $replacement。
Last updated
Was this helpful?