寻求POSIX兼容方案移除文件中的特殊不可见字符
寻求POSIX兼容方案移除文件中的特殊不可见字符
看起来你碰到的是典型的Windows来源文件问题——带UTF-8字节顺序标记(BOM)和Windows风格的换行符(^M,也就是CR字符)。你之前的sed命令只处理了部分字符,没搞定完整的BOM,我给你几个POSIX兼容的靠谱方案:
方案1:用sed一次性清理BOM和CR字符
BOM是文件开头的三个字节0xEF 0xBB 0xBF,对应shell里的$'\357''\273''\277',我们可以针对性处理第一行的BOM,同时去掉所有行尾的CR:
sed -i -e '1s/^\357\273\277//' -e 's/\r$//' ~/check_disk_space.sh
1s/^\357\273\277//:只在第一行开头匹配并移除BOM(因为BOM只会出现在文件开头)s/\r$//:移除每行末尾的CR字符(也就是你看到的^M)
方案2:用awk处理(适合sed -i不兼容的场景)
有些系统的sed -i选项可能不是POSIX标准实现,这时候用awk更稳妥:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")} {sub(/\r$/,"")}1' ~/check_disk_space.sh > temp_cleaned.sh && mv temp_cleaned.sh ~/check_disk_space.sh
NR==1{sub(/^\xef\xbb\xbf/,"")}:第一行移除BOM{sub(/\r$/,"")}:每行移除末尾的CR1:awk的简写,意思是打印所有处理后的行- 最后把处理后的内容写入临时文件,再替换原文件(因为awk没有标准的原地编辑选项)
方案3:用dos2unix(如果系统已安装)
如果你的系统默认装了dos2unix工具,这是最省心的方式,它会自动处理Windows换行符和UTF-8 BOM:
dos2unix ~/check_disk_space.sh
补充说明
你之前的sed命令没移除BOM,是因为只匹配了BOM的其中两个字节(\302和\273),但完整的BOM是三个字节,所以必须匹配全部三个才能彻底移除。
备注:内容来源于stack exchange,提问作者Ashar
相关产品推荐
相关产品推荐

