本文目录导读:

理解换行符差异
- Windows:
\r\n(CRLF) - Linux/macOS:
\n(LF)
脚本内统一处理
方法1:使用tr命令转换
# 将CRLF转换为LF(适用于文本文件) tr -d '\r' < input.txt > output.txt # 或者使用sed sed -i 's/\r$//' input.txt
方法2:使用perl
# 将LF转换为CRLF perl -pe 's/\n/\r\n/' input.txt > output.txt # 将CRLF转换为LF perl -pe 's/\r\n/\n/' input.txt > output.txt
方法3:使用dos2unix/unix2dos工具
# 安装(CentOS) yum install dos2unix # 转换 dos2unix input.txt # CRLF -> LF unix2dos input.txt # LF -> CRLF
跨平台脚本最佳实践
Python示例:自动检测并转换
# 读取文本文件时自动转换
with open('file.txt', 'r', newline='') as f:
content = f.read()
# 写入时指定换行符
with open('file.txt', 'w', newline='\n') as f:
f.write(content)
Bash脚本:使用sed处理变量
#!/bin/bash # 去除所有回车符 content=$(cat file.txt | tr -d '\r') # 添加统一换行符 echo -e "$content" > new_file.txt
版本控制中的换行符处理
Git配置
# 全局配置(推荐) git config --global core.autocrlf true # Windows: 提交LF,检出CRLF git config --global core.autocrlf input # Mac/Linux: 提交LF,检出LF # 仓库级配置 git config core.autocrlf true
.gitattributes文件
在仓库根目录创建.gitattributes:
*.txt text eol=lf # 强制所有文本文件使用LF
*.sh text eol=lf # 脚本文件使用LF
*.bat text eol=crlf # Windows脚本使用CRLF
*.ps1 text eol=crlf # PowerShell脚本使用CRLF
*.md text # 自动检测换行符
编辑器配置
VS Code
{
"files.eol": "\n", // 统一使用LF
"files.autoGuessEncoding": true
}
vim
" 设置默认换行符 set fileformat=unix " 默认保存为LF " 或使用命令 :set ff=unix
检测换行符的工具
查看文件换行符类型
# 使用file命令 file input.txt # 使用od命令 od -c input.txt | head -n 2 # 使用cat -A(显示特殊字符) cat -A input.txt | head -n 3 # 输出示例: line1^M$line2^M$ # ^M = \r, $ = \n
完整脚本示例
跨平台换行符统一工具
#!/bin/bash
# 统一换行符脚本 - normalize_line_endings.sh
if [ $# -ne 1 ]; then
echo "用法: $0 <filename>"
exit 1
fi
file="$1"
if [ ! -f "$file" ]; then
echo "错误: 文件不存在"
exit 1
fi
# 检测当前换行符类型
if grep -q $'\r$' "$file"; then
echo "检测到CRLF换行符,正在转换为LF..."
sed -i 's/\r$//' "$file"
echo "转换完成"
else
echo "文件已经是LF换行符"
fi
# 确保末尾有换行符
if [ "$(tail -c 1 "$file")" != "" ]; then
echo >> "$file"
fi
Python跨平台脚本
#!/usr/bin/env python3
import sys
import os
def normalize_line_endings(filepath, target_eol='\n'):
"""
统一文件换行符
target_eol: '\n' (LF) 或 '\r\n' (CRLF)
"""
with open(filepath, 'rb') as f:
content = f.read()
# 统一先转换为LF
content = content.replace(b'\r\n', b'\n').replace(b'\r', b'\n')
# 如果目标为CRLF,则转换
if target_eol == '\r\n':
content = content.replace(b'\n', b'\r\n')
with open(filepath, 'wb') as f:
f.write(content)
if __name__ == '__main__':
if len(sys.argv) > 1:
for filepath in sys.argv[1:]:
normalize_line_endings(filepath)
print(f"已处理: {filepath}")
else:
print("请指定要处理的文件")
最佳实践总结
- 统一使用LF:跨平台环境下,推荐将所有文本文件统一为LF(Unix风格)。
- 版本控制配合:使用Git的
core.autocrlf或.gitattributes自动处理。 - 编写脚本时注意:
- 使用
#!/bin/bash明确指定解释器 - 避免在脚本中混合使用
\n和\r\n
- 使用
- 测试验证:定期检查脚本文件的换行符一致性。
- 自动转换:在CI/CD流程中加入换行符检查步骤。
通过以上方法,可以有效地统一脚本中的换行符,确保在不同操作系统上的兼容性。