跳至内容
ksh93字符串处理

ksh93字符串处理

October 24, 2026

ksh93字符串处理

替换

为特殊字符的前面批量添加另外的字符

bash 无法做到替换的时候保留原字符,但是 ksh(ksh93) 可以做到!

# 将变量 part 中的 [、]、\ 前面统一加上 \[、\]、\\
key_q+=${part//@(['[]\'])/\\\1}

核心语法拆解:

  • //:表示全局替换(如果只写单个 /,则只替换第一个匹配项)。

  • @(...):ksh93 的扩展模式匹配操作符,表示“匹配括号内的任意一个子模式”。

  • ['[]\']:括号内定义了需要匹配的字符集——中括号 [、] 以及反斜杠 \。

  • \\\1:替换目标。其中 \1 是后向引用(Backreference),代表当前被匹配到的原字符本身;前面的 \ 用于输出一个字面量的反斜杠。

比如:原始的字符串是:][ .\\\[]][],转换后的字符串变成了:\]\[ .\\\\\\\[\]\]\[\]。

这种纯内建的字符串替换方式完全基于内存操作,零外部进程开销(Zero Fork),是 ksh93 高效处理文本的杀手级特性之一。不过需要注意,在使用这种替换功能时,保证所有的变量都初始化过。

类似的替换有下面5种格式:

  • @(...)(精确匹配其中一个)

  • *(...)(匹配零次或多次)

  • +(...)(匹配一次或多次)

  • ?(...)(匹配零次或一次)

  • !(...)(反向匹配,排除括号内内容)

再看一个例子:

str="user=admin"

result=${str//+([a-z])=+([a-z])/[\2] -> (\1)}
print -- "$result"
# 输出结果:[admin] -> (user)

类似的功能在 bash 中叫 extglob 匹配,并且默认是关闭的,需用通过 shopt 命令打开,并且在 bash 中的其实是半成品,可以匹配但是替换的字符中无法同时包含原字符,没有 ksh 中的强大,ksh 中的这些功能都是直接开箱即用的。


✍️ 本文作者:秦大炮 (Qindapao)

欢迎技术交流与转载。转载请注明出处,并保留以下硬核联系方式。


最后更新于