You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求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$/,"")}:每行移除末尾的CR
  • 1:awk的简写,意思是打印所有处理后的行
  • 最后把处理后的内容写入临时文件,再替换原文件(因为awk没有标准的原地编辑选项)

方案3:用dos2unix(如果系统已安装)

如果你的系统默认装了dos2unix工具,这是最省心的方式,它会自动处理Windows换行符和UTF-8 BOM:

dos2unix ~/check_disk_space.sh

补充说明

你之前的sed命令没移除BOM,是因为只匹配了BOM的其中两个字节(\302和\273),但完整的BOM是三个字节,所以必须匹配全部三个才能彻底移除。

备注:内容来源于stack exchange,提问作者Ashar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 15:18:19