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

如何根据正负分数分割单词?Bash字符串截取适配问题

解决Bash中按正负分数比例截取字符串的问题

要处理正负分数对应的字符串截取,核心是先解析分数的符号、分子和分母,再根据正负分别计算截取的起始位置或长度:

解决方案:自定义函数处理

split_word() {
    local word="$1"
    local frac="$2"
    local total_len=${#word}
    
    # 提取分数的符号
    local sign=1
    if [[ $frac == -* ]]; then
        sign=-1
        frac=${frac#-}
    fi
    
    # 拆分分子和分母
    local numerator=${frac%/*}
    local denominator=${frac#*/}
    
    # 计算需要截取的字符长度(整数除法)
    local cut_len=$(( total_len * numerator / denominator ))
    
    # 根据符号选择截取方式
    if (( sign == 1 )); then
        # 正分数:从开头截取对应长度
        echo "${word:0:$cut_len}"
    else
        # 负分数:从末尾截取对应长度
        echo "${word: -$cut_len}"
    fi
}

测试示例

  • 处理正分数场景(swimming +3/4):
split_word "swimming" "3/4"
# 输出:swimmi(总长度8,8*3/4=6,截取前6个字符)
  • 处理负分数场景(running -2/7):
split_word "running" "-2/7"
# 输出:ng(总长度7,7*2/7=2,截取末尾2个字符)

原命令失效原因

你之前的命令echo ${word:0:${#word}*$frac}无法处理负分数,是因为Bash的算术扩展仅支持整数运算:

  • 当$frac为-2/7时,${#word}*$frac会被解析为7*-2/7,整数除法结果为-2
  • ${word:0:-2}的语义是从开头截取到倒数第2个字符,而非从末尾截取2个字符,这就导致了结果不符合预期

注意事项

  • Bash的整数除法会截断向零,若总长度×分子无法被分母整除,结果会取整数部分(例如swimming 2/3会截取前5个字符)
  • 确保输入的分数格式为±num/den,且分子、分母均为正整数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:31:03