跨操作系统的Redis批量插入协议格式适配及命令兼容问题
搞定Redis批量插入在Linux/Alpine容器里的格式转换问题
我懂你碰到的这个坑!在macOS上用cat ${FILE} | perl -i -p -e 's|[\r\n]+|\n|g' | redis-cli --pipe能顺利处理换行符并完成批量插入,但这套命令放到Linux或者Alpine镜像的Docker容器里就直接失效了。这主要是两个原因:一是macOS和Linux的换行符标准不一样,二是Alpine自带的perl对-i参数的逻辑处理和macOS上的perl不同——-i是用来原地修改文件的参数,但你这里是用管道流式处理,这个参数完全没用,反而会拖后腿。
给你几个适配Linux/Alpine环境的可行方案,随便挑一个用就行:
方案1:用sed替换换行符(首推,Alpine默认自带sed)
sed在Linux和Alpine容器里都是默认预装的,直接用它清理多余的回车符就行:
cat ${FILE} | sed 's/\r$//' | redis-cli --pipe
这个命令会把每行末尾的回车符(\r)删掉,把macOS/Windows风格的换行转换成Linux标准的\n,完美匹配Redis批量插入要求的RESP协议格式。
方案2:调整原有的perl命令(去掉无用的-i参数)
你原来的perl命令里的-i参数在管道场景下完全是多余的,删掉它就能正常运行:
cat ${FILE} | perl -p -e 's|[\r\n]+|\n|g' | redis-cli --pipe
去掉-i后,perl就会正常处理管道里的数据流,统一把所有换行符转换成标准的\n。
方案3:用awk处理换行(备选方案)
如果你的环境里awk用着更顺手,也可以用它来做同样的事:
cat ${FILE} | awk '{sub(/\r$/,""); print}' | redis-cli --pipe
效果和sed方案完全一致,都是清理掉干扰RESP协议解析的多余回车符。
最后补充一句:Redis的--pipe命令对输入格式要求很严,必须符合RESP协议,换行符不统一会直接导致协议解析失败,所以核心就是把所有换行转换成Linux标准的\n,干掉\r这个捣蛋鬼就搞定了~
内容的提问来源于stack exchange,提问作者mrdoubtful
相关产品推荐
相关产品推荐

