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!