Shell中的原生字符串处理方法
目录
前言
Linux Shell(Bash)提供了强大的原生字符串处理能力,主要依赖内置的参数扩展(Parameter Expansion)语法,无需调用 awk、sed 等外部工具,由于在bash的内部执行,不需要fork外部程序,执行效率高。
具体方法
测试使用的变量为: str="Hello, Shell World!"
获取长度
使用 ${#variable} 语法获取字符串的字符串。
echo ${#str} # 输出: 19如果当前的环境的语言配置是正确的,那么可以正确识别unicode字符,比如中文,会正确按照字符的个数输出。
截取子串
使用 ${variable:start:length} 语法(基于索引截取,从0开始)。
# 从索引 7 开始截取 5 个字符
echo ${str:7:5} # 输出: Shell
# 从索引 7 开始一直截取到末尾
echo ${str:7} # 输出: Shell World!
# 从右边倒数第 6 个字符开始截取
echo ${str: -6} # 输出: World! (注意冒号和负号之间必须有空格)匹配删除
使用 # 和 % 符号,通过模式匹配来删除字符串的一部分。
- 最短匹配删除(非贪婪模式)
#删除左侧匹配内容:echo ${str#*o}(删除第一个o及左侧字符 ->, Shell World!)%删除右侧匹配内容:echo ${str%o*}(删除最后一个o及右侧字符 ->Hello, Shell W)
- 最长匹配删除(贪婪模式)
##删除左侧最长匹配:echo ${str##*o}(删除最后一个o及左侧字符 ->rld!)%%删除右侧最长匹配:echo ${str%%o*}(删除第一个o及右侧字符 ->Hell)
在上面的匹配模式中,* 号表示任意字符,还有别的符号可选,比如:? 表示任意一个字符。
查找与替换
使用 ${variable/pattern/string} 语法,默认只替换一次,双斜杠 // 替换所有。
# 将第一个 World 替换为 Linux
echo ${str/World/Linux} # 输出: Hello, Shell Linux!
# 将所有的 l 替换为大写的 L
echo ${str//l/L} # 输出: HeLLo, SheLL WorLd!