如何根据正负分数分割单词?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
相关产品推荐
相关产品推荐

