Bash中如何拆分含空格的|分隔字符串并保留空格?
问题原因&解决办法
你这脚本的问题出在俩地方:
- 错误把awk输出存成数组:
a=(awk...)这种写法,Bash会把awk的输出按空格、换行这些空白字符拆成数组元素。你awk输出的是how are you|fine|and you?,直接就被拆成了how、are、you|fine|and、you?这四个碎块,根本不是你要的完整分隔字符串。 - 用字符串替换拆分的方式不对:就算
a是正确的完整字符串,b=(${a//|/ })这种写法,Bash在展开的时候还是会按空白字符拆分,带空格的内容直接就被拆碎了。
正确写法
第一步:先把awk输出存成普通字符串
别用数组赋值,直接存成普通变量:
a=$(awk 'BEGIN{ x="how are you"; y="fine"; z="and you?"; printf("%s|%s|%s",x,y,z)}')
这时候a的内容就是完整的how are you|fine|and you?。
第二步:用IFS+read拆分(保留空格)
要按|拆分带空格的字符串,最靠谱的方式是临时设置分隔符,再用read读进数组:
IFS='|' read -ra b <<< "$a"
IFS='|':临时把字段分隔符改成|,只对这次read命令生效-r:避免反斜杠被转义,保证内容原样读取-a b:把拆分后的内容存进数组b<<< "$a":把字符串a作为read的输入
完整脚本
a=$(awk 'BEGIN{ x="how are you"; y="fine"; z="and you?"; printf("%s|%s|%s",x,y,z)}') IFS='|' read -ra b <<< "$a" # 测试输出 echo "${b[0]}" echo "${b[1]}" echo "${b[2]}"
执行后就能得到你想要的结果:
how are you fine and you?
内容的提问来源于stack exchange,提问作者Rasec Malkic
相关产品推荐
相关产品推荐

