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

求助:如何让sed对字符串逐字符重复替换?脚本输出不符合预期

问题解决:让sed按单个字符拆分字符串

你的脚本当前输出不符合预期的原因是explodeString函数里的sed命令匹配了连续的字母数字序列,而非单个字符,导致awk将整个输入字符串当作一个字段处理。

修正后的脚本

#!/bin/bash

makePatternMatch()
{
    echo "${charList}" | awk 'BEGIN{
        regExp="" ;
    }
    {
        if( $0 != "" ){
            for( i=1 ; i <= NF ; i++ ){
                regExp=sprintf("%s[%s%s]", regExp, toupper($i), tolower($i) ) ;
            } ;
        } ;
    }END{
        printf("%s\n", regExp ) ;
    }'
}

explodeString()
{
    # 匹配单个字母数字字符,每个字符后添加空格
    charList=$(echo "${pattern}" | sed 's/[[:alnum:]]/& /g')
}


for pattern in "$@"
do
    explodeString
    makePatternMatch
done

关键修改说明

  • 将原sed命令s+[[alphanum]]*+&\ +g替换为s/[[:alnum:]]/& /g:
    • [[:alnum:]]是POSIX标准的字母数字字符类(对应你提到的[[alphanum]]的正确写法),匹配单个字母或数字;
    • &表示匹配到的单个字符,替换为& 即给每个匹配的字符后加空格,这样每个字符会被awk识别为独立字段。
  • 同时将for pattern in $@改为for pattern in "$@",避免包含空格的命令行参数被错误拆分。

测试效果

执行scriptname abc时,输出将变为[Aa][Bb][Cc],符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:07:26