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)
欢迎技术交流与转载。转载请注明出处,并保留以下硬核联系方式。
- 🔗 独立博客: qindapao.com
- 💻 GitHub: github.com/qindapao
- 📧 Email: nothisland2017@gmail.com
最后更新于