Linux终端移除Oracle输出中CRLF字符 常规方案无效如何解决
Oracle导出异常换行问题解决方案
根因说明
你之前尝试的所有常规CRLF清理方案,仅针对行终止位置的回车换行符生效。从Oracle导出数据出现的异常断行,90%以上是字符串(VARCHAR2/CLOB类型)字段值内部嵌入的\r\n控制字符,这类字符不在行尾位置,因此行尾匹配规则完全无法命中。
方案1:查询阶段源头清理(推荐)
直接在SQL语句中替换掉字段内的控制字符,无需事后处理文件:
-- 移除字段内所有CR(CHR(13)即\r)、LF(CHR(10)即\n) SELECT REPLACE(REPLACE(目标字段名, CHR(13), ''), CHR(10), '') AS cleaned_content FROM 业务表名;
如果需要保留正常换行逻辑,仅删除多余的回车符,只替换CHR(13)为空即可。
方案2:已导出文件事后修复
如果已经完成导出,sed类工具按行读取的机制会自动吞掉行尾换行符,无法匹配到非行尾位置的控制字符,可使用perl做全局全文件匹配替换:
# 删除文件内所有位置的\r字符,无论是否在行尾 perl -pe 's/\r//g' 原导出文件路径 > 清理后文件路径
如果使用固定分隔符导出、不允许字段内存在任何换行,可直接全局删除所有\r和\n:
# 一次性清除所有位置的CR、LF控制符 perl -0777 -pe 's/\r|\n//g' 原导出文件路径 > 清理后文件路径
此前命令无效的原因说明
sed 's/\r$//'、dos2unix:仅匹配并删除行尾、紧邻LF前的\r,字段内部的\r不会被处理sed 's/\n//g':sed默认按行遍历文本,读取阶段就已经剥离了行尾的\n,正则根本匹配不到换行符tr -d '\r':理论上可删除所有位置的\r,如果执行后仍有异常,建议用hexdump -C 文件名重新核对十六进制编码,确认是否是UTF-16等非单字节编码导致的控制字符识别偏差,避免把其他Unicode控制字符误判为CRLF。
内容的提问来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

