最省事的是用dos2unix,但需先检查是否安装;若不可安装,则用sed或vim替代。dos2unix非所有linux默认自带,安装后执行dos2unix filename.txt即可原地转换,注意默认不备份;sed方案为sed -i 's/\r$//' filename.txt,仅删行尾\r;vim中用:set ff=unix可切换格式,混有\r\n和\n时需手动:%s/\r$//e;批量处理推荐find命令,注意文件类型避免二进制损坏。

直接用 dos2unix 最省事,但得先确认它装没装;如果不能装新工具,sed 和 vim 是现成替代方案,只是细节容易出错。
检查并安装 dos2unix 工具
dos2unix 不是所有 Linux 发行版默认自带的,尤其最小化安装的 CentOS/RHEL 或 Alpine。运行 dos2unix --version 看是否报 “command not found”。
- Debian/Ubuntu:用
sudo apt install dos2unix - CentOS/RHEL 8+:用
sudo dnf install dos2unix - CentOS/RHEL 7:用
sudo yum install dos2unix - Alpine:用
apk add dos2unix
装好后,dos2unix filename.txt 就能原地覆盖转换——注意它默认不备份,误操作会丢原始换行逻辑。
用 sed 删除 \r(最常用免安装方案)
sed -i 's/\r$//' filename.txt 是安全删 \r 的写法,只删行尾的 \r,避免误伤行内内容(比如某些日志里真有 \r 字符)。
- 别写成
sed -i 's/\r//g':全局删可能破坏含\r的二进制或特殊文本 - 别漏
$锚点:没有它,\r出现在行中也会被删 - 如果文件名含空格或特殊字符,建议加引号:
sed -i 's/\r$//' "my script.sh" - 想预览效果不改原文件?去掉
-i,用sed 's/\r$//' filename.txt | cat -A看是否还有^M
在 vim 中快速切换 fileformat
用 vim filename.txt 打开后,命令模式下输入 :set ff? 能看到当前格式(显示 fileformat=dos 就说明带 \r\n)。
- 转 Unix:输入
:set ff=unix,再:wq保存——这是最稳妥的编辑器内方案 - 如果文件里混着
\r\n和\n(比如部分行是 Windows 编辑、部分是 Linux 生成),:set ff=unix只影响新写入行为,不会清理已有\r;这时得用:%s/\r$//e手动替换 -
^M在 vim 里不是字面字符,输入它要用Ctrl+v Ctrl+m,别直接打^和M
批量处理和脚本自动化注意事项
批量转一堆文件时,别无脑套 for f in *.sh; do dos2unix "$f"; done——万一某个文件是软链接或权限不足,脚本就中断。
- 推荐用
find . -type f -name "*.sh" -exec dos2unix {} \;,find自动跳过不可读文件 - 要保留原始时间戳?加
-k参数:dos2unix -k script.sh - 想留备份?用
-n:dos2unix -n old.sh new.sh,原始文件不动 - 脚本里调用前最好先判断换行符类型:
file -bi filename.sh | grep -q 'crlf' && dos2unix filename.sh
真正麻烦的不是转换动作本身,而是有些文件看着像文本,其实是二进制(比如 .pyc、.so 或压缩包),dos2unix 默认会跳过它们,但 sed -i 会照删 \r 导致损坏——所以批量前务必确认文件类型。











