Shell 字符串操作:切片、长度与替换技巧
在 Shell 脚本中,字符串处理是日常任务的重要组成部分,包括提取子串、计算长度、替换内容等。掌握这些操作能帮助你高效处理文本数据,如日志分析、配置解析等。本文详细讲解 Shell 中常用的字符串操作方法。
字符串切片:提取子字符串
字符串切片用于从指定位置开始提取部分字符,Shell 提供了两种灵活的切片语法,下标从 0 开始(第一个字符为位置 0)。
从指定位置截取到结尾
语法:${变量:起始位置}
- 从
起始位置开始,截取到字符串末尾的所有字符。 - 若
起始位置为负数(需用括号包裹),表示从字符串末尾倒数计算。
示例:
1 | str="abcdefgh" |
截取指定长度的子串
语法:${变量:起始位置:长度}
- 从
起始位置开始,截取指定长度的字符(若剩余字符不足,则截取到结尾)。
示例:
1 | str="123456789" |
注意:若起始位置超过字符串长度,返回空值;若长度为负数,在 Bash 4.2+ 中表示 “截取到距离末尾 长度 个字符的位置”。
字符串长度:计算字符个数
使用 ${#变量名} 可获取字符串的长度(字符个数),适用于检查输入合法性、限制字符数量等场景。
示例:
1 | # 普通字符串 |
字符串替换:修改匹配内容
Shell 支持两种替换模式:替换第一个匹配项和替换所有匹配项,无需依赖 sed 等外部工具。
替换第一个匹配项
语法:${变量/旧字符串/新字符串}
- 仅替换字符串中第一个与
旧字符串匹配的部分。
示例:
1 | path="/usr/local/bin:/usr/bin:/bin" |
替换所有匹配项
语法:${变量//旧字符串/新字符串}
- 替换字符串中所有与
旧字符串匹配的部分(双斜杠//表示全局替换)。
示例:
1 | str="a,b,c,d" |
条件性替换
- 替换开头匹配项:
${变量/#旧字符串/新字符串}(仅替换字符串开头的匹配项)。 - 替换结尾匹配项:
${变量/%旧字符串/新字符串}(仅替换字符串结尾的匹配项)。
示例:
1 | file="report.txt.bak" |
实际应用案例
解析文件路径
1 | file_path="/home/user/docs/report.pdf" |
(注:## 和 # 是贪婪 / 非贪婪删除前缀的操作,%% 和 % 是删除后缀的操作,本质是特殊的替换形式)
处理用户输入
1 |
|
执行效果:
1 | 请输入姓名:jOhN |