求助:使用Sed替换逗号时无法添加换行符的解决方法
解决Shell变量逗号转换行的问题
有变量 release=abc,xyz,pqr,bnm,期望输出每个元素单独一行:
abc xyz pqr bnm
原尝试脚本:
release=abc,xyz,pqr,bnm for i in $release;do b=`echo $i| sed 's/,/\\n/g'` echo $b done
当前输出为 abc xyz pqr bnm,不符合预期。
问题分析
原脚本的问题出在两点:
- 默认Shell的分隔符(IFS)是空格、制表符和换行,逗号不会触发分割,所以
for i in $release里的i拿到的是整个字符串,循环只执行一次。 echo $b没有用引号包裹,Shell会把sed生成的换行符转换成空格,最终输出变成空格分隔。
解决方法
方法1:修正原脚本(最小改动)
给echo加上引号,保留换行符:
release=abc,xyz,pqr,bnm for i in $release;do b=$(echo "$i" | sed 's/,/\n/g') echo "$b" done
其实这里循环完全没必要,直接一行处理更高效:
release=abc,xyz,pqr,bnm echo "$release" | sed 's/,/\n/g'
方法2:用tr命令更简洁
tr专门用于字符替换,比sed更适合这个场景:
release=abc,xyz,pqr,bnm tr ',' '\n' <<< "$release"
方法3:修改IFS分割变量后循环
如果需要逐个处理每个元素(比如后续要添加其他操作),可以临时修改IFS为逗号:
release=abc,xyz,pqr,bnm IFS=',' # 临时设置分隔符为逗号 for item in $release; do echo "$item" done unset IFS # 恢复默认分隔符
方法4:用printf格式化输出
利用参数扩展把逗号换成空格,再用printf逐个输出换行:
release=abc,xyz,pqr,bnm printf "%s\n" "${release//,/ }"
内容的提问来源于stack exchange,提问作者Nitish
相关产品推荐
相关产品推荐

