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

如何获取字符串中各含空格字段宽度并存储为指定格式变量

解决方案

方法一:基于起始位置计算长度

你已经能获取每个单词的起始位置,只需通过起始位置的差值就能算出每个字段的长度,最后一个字段用字符串总长度减去最后一个起始位置即可。代码如下:

string="AB        BC_DEF     GH   I       " 
words=("AB" "BC_DEF" "GH" "I")

# 收集所有单词的起始位置到数组
start_pos=()
for w in "${words[@]}"; do
    start_pos+=($(echo "$string" | grep -bo "$w" | sed 's/:.*$//'))
done

# 计算各字段长度
lengths=()
total_str_len=${#string}
for ((i=0; i<${#start_pos[@]}; i++)); do
    if (( i == ${#start_pos[@]} - 1 )); then
        # 最后一个字段:字符串总长度减去当前起始位置
        lengths+=($(( total_str_len - start_pos[i] )))
    else
        # 前面的字段:下一个起始位置减去当前起始位置
        lengths+=($(( start_pos[i+1] - start_pos[i] )))
    fi
done

# 格式化为要求的变量格式
pos="\"${lengths[*]}\""
echo "pos = $pos"

执行后输出:

pos = "10 11 5 8"

方法二:用AWK直接匹配字段

利用AWK的正则匹配功能,直接提取每个单词及其后续空格组成的字段长度,代码更简洁:

string="AB        BC_DEF     GH   I       " 
words=("AB" "BC_DEF" "GH" "I")

# 将单词数组拼接为正则分组,匹配每个单词开头的片段
pattern=$(IFS='|'; echo "^(${words[*]})")

# 用AWK循环提取每个字段的长度
lengths=$(echo "$string" | awk -v pat="$pattern" '{
    while (match($0, pat)) {
        print RLENGTH
        $0 = substr($0, RSTART + RLENGTH)
    }
    # 处理最后一段内容
    if (length($0) > 0) print length($0)
}')

# 格式化为目标变量格式
pos="\"$(echo $lengths | tr '\n' ' ')\""
echo "pos = $pos"

执行后同样得到目标输出:

pos = "10 11 5 8"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:39:22