应使用sed -i 's/\r$//' filename精准删除行尾\r,避免误删行中字符;$锚定行尾确保只处理Windows换行符\r\n中的\r,保留Linux所需的\n。

直接用 sed -i 's/\r$//' 文件名 就行。核心是匹配行尾的 \r 并删掉,留下纯 \n。
为什么用 \r$ 而不是 \r
Windows 换行符是 \r\n,Linux 是 \n。\r 总在 \n 前面,且一定处于行尾位置(即紧挨着换行符)。加 $ 锚定行尾,能精准删除 \r,避免误删行中可能出现的其他 \r 字符(比如某些日志或二进制残留)。
-
s/\r$//:只删每行末尾那个\r -
s/\r//g:会删掉所有\r,不够安全 -
s/.$//:靠删最后一个字符“碰运气”,如果文件本身有空格或制表符结尾就出错
批量处理多个文件
常见场景是整个目录下的文本文件都要转换,推荐用 find 配合 sed:
- 按扩展名处理:
find . -name "*.txt" -exec sed -i 's/\r$//' {} + - 限制类型更稳妥:
find . -type f -name "*.sh" -exec sed -i 's/\r$//' {} + - 先预览再执行(加
-n和p):sed -n 's/\r$//p' file.txt看效果
确认是否已转换成功
别凭感觉,用 file 或 hexdump 验证:
-
file -b filename:输出含CRLF表示还是 Windows 格式;只写ASCII text通常说明已转为 LF -
head -n2 filename | hexdump -C:看到0a(LF)结尾就是对的;若看到0d 0a(CR+LF)说明还没转干净 - Vim 中输入
:set list,能看到^M就是残留的\r
备选方案(不依赖 sed)
如果环境没装 GNU sed,或想更直观操作:
-
tr -d '\r' < input.txt > output.txt:简单粗暴,删所有\r,适合纯文本 - Vim 中打开文件后执行:
:%s/\r$//e(e参数避免报错) -
dos2unix filename:需安装dos2unix工具,专为此设计,最省心


















