^m是windows换行符\r\n中的\r,在linux中显示为^m,导致脚本报错;可用cat -a确认,tr -d '\r'或dos2unix删除,注意sed中\r需正确转义且跨平台兼容性差。

^M 是 Windows 换行符 \r\n 中的 \r(回车符),在 Linux 下显示为 ^M,常见于从 Windows 编辑后传到 Linux 的脚本或配置文件中,会导致 bash: $'\r': command not found 这类错误。
怎么确认文件里有 ^M
别靠肉眼扫,用 cat -A 最可靠:
cat -A filename如果看到行尾有
^M(不是字母 ^ 和 M,而是控制字符),说明存在 \r。也可以用 file 命令粗略判断:file filename输出含
CRLF 或 with CRLF line terminators 就是 Windows 风格换行。
tr -d '\r' 是最轻量、最通用的删除方式
它不依赖文件编码、不改空行逻辑、不碰 BOM,只删 \r 字符:
直播话术巡检系统(Windows版) — 实时语音转写、关键词检测、场景自动切换、告警推送、大屏可视化。支持 Windows VB-Cable 虚拟声卡音频采集,阿里云 ASR 实时识别。一键启动脚本,自动安装环境。
tr -d '\r' output.txt或直接原地替换(需临时文件):
tr -d '\r' /tmp/file.tmp && mv /tmp/file.tmp file.txt注意:
tr 不能用 -i 参数原地修改,这点和 sed 不同;另外它对二进制内容敏感,只建议用于纯文本。
dos2unix 是最省心但需额外安装的方案
它不只是删 \r,还会处理 BOM、空行一致性、甚至识别并跳过二进制段:
dos2unix filename如果提示
command not found,CentOS/RHEL 用 yum install dos2unix,Ubuntu/Debian 用 apt install dos2unix。注意:某些旧版 dos2unix 默认不覆盖只读文件,加 -f 强制;它也支持批量:dos2unix *.sh
sed 's/\r$//' 容易出错的写法要避开
很多人写 sed 's/^M$//g',但 ^M 必须用 Ctrl+V Ctrl+M 输入,否则就是字面量 ^M,不生效;更安全的是用转义:
sed 's/\r$//' filename但要注意:
sed 在 macOS(BSD)下不认 \r,得用 $'s/\r$//' 或改用 gsed;另外 sed -i 在不同系统行为不一(GNU vs BSD),跨平台脚本慎用原地修改。真正麻烦的不是删 \r,而是删完后发现脚本仍报错——那往往是文件权限没设可执行、shebang 行被破坏、或 \r 藏在中间(比如 echo 后多了一个 \r 导致命令拼错)。处理前先 cat -A 看全貌,比盲目替换更有效。










