本文目录导读:

理解换行符差异
- 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流程中加入换行符检查步骤。
通过以上方法,可以有效地统一脚本中的换行符,确保在不同操作系统上的兼容性。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播