You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求纯POSIX Shell下统计或去除字符串前导空格的方案

纯POSIX Shell实现:去除前导空格/统计前导空格数

针对你的需求,这里提供完全基于POSIX Shell内置特性的实现,无需调用任何外部进程(包括expr),也不依赖bash专属语法,完美契合轻量化、高可移植性的要求:

1. 去除字符串前导空格(保留尾部空格)

trim_leading() {
    local str="$1"
    # 核心逻辑:先提取所有前导空格,再从原字符串中删除这部分前缀
    printf '%s\n' "${str#"${str%%[![:space:]]*}"}"
}

原理说明

  • ${str%%[![:space:]]*}:POSIX参数展开的最长后缀删除,会删除从第一个非空格字符到字符串末尾的所有内容,最终得到原字符串的所有前导空格(若字符串全为空格则保留全部)。
  • ${str#"$leading_spaces"}:POSIX参数展开的最短前缀删除,将原字符串开头的前导空格部分移除,得到去除前导空格后的结果。
  • 全程由Shell内置处理,无任何进程启动开销。

2. 统计字符串前导空格数量

count_leading_spaces() {
    local str="$1"
    # 提取前导空格后,用${#}获取其长度
    local leading_spaces="${str%%[![:space:]]*}"
    printf '%d\n' "${#leading_spaces}"
}

原理说明

  • 同样通过${str%%[![:space:]]*}提取所有前导空格。
  • ${#leading_spaces}:POSIX标准的参数长度获取,直接返回字符串的字符数(即前导空格的数量),完全是内置操作,无性能损耗。

测试示例

# 测试去除前导空格
test_str="   hello world   "
trimmed=$(trim_leading "$test_str")
echo "原字符串: '$test_str'"
echo "去除前导后: '$trimmed'" # 输出: 'hello world   '

# 测试统计前导空格
space_count=$(count_leading_spaces "$test_str")
echo "前导空格数: $space_count" # 输出: 3

这些实现完全符合POSIX 1003.1标准,在dash、ksh、BusyBox sh等各类POSIX兼容Shell中都能正常运行,彻底解决之前expr重复调用导致的性能瓶颈。

内容的提问来源于stack exchange,提问作者ESR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:42:24