求助:如何让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
相关产品推荐
相关产品推荐

