Linux dos2unix 命令 - windows 与 Linux 文本格式互转与编码转换
Windows 系统使用 CR + LF(\r\n)作为换行符,Unix / Linux 使用 LF(\n)作为换行符,老版本的 Mac 使用 CR(\r)作为换行符。当文件需要在不同的系统中使用时,需要转换其内容格式。
dos2unix 命令是 Linux / Unix 系统中用于把 DOS / Windows 、Mac 系统的换行符转换为 Unix / Linux 系统的换行符的工具,同能还能转换编码。
unix2dos 命令是 Linux / Unix 系统中用于把 Unix / Linux 系统的换行符转换为 DOS / Windows、Mac 系统的换行符的工具。
安装方法 dos2unix / unix2dos
在 Linux 系统的各发行版中,一般没有预装 dos2unix 与 unix2dos 命令,这两个命令同在 dos2unix 软件包中,不同的发行版使用如下命令安装 dos2unix 命令。
[!NOTE]
dos2unix软件包包含四个命令dos2unix,unix2dos,mac2unix,unix2mac。
Debian / Ubuntu 系列
在 Debian / Ubuntu 系列发行版中使用如下命令安装 dos2unix / unix2dos 命令:
sudo apt update
sudo apt install -y dos2unix
RHEL / AlmaLinux / Rocky Linux 系列
在 RHEL / AlmaLinux / Rocky Linux 系列发行版中使用如下命令安装 dos2unix / unix2dos 命令:
# RHEL 8+ / AlmaLinux / Rocky Linux
sudo dnf install -y dos2unix
相似功能命令对比
tr命令: 可以删除\r,实现把 DOS 系统的换行符转换为 Linux 系统换行符。
命令语法
dos2unix / unix2dos 两个命令的语法结构相同,其具体语法结构形式为:
dos2unix [选项] [文件 ...] [-n 输入文件 输出文件 ...]
unix2dos [选项] [文件 ...] [-n 输入文件 输出文件 ...]
语法中各部分的说明:
[选项]: 控制具体执行的行为:模式、编码等。[文件 ...]: 需要转换的一个或多个文件,支持使用通配符。-n 输入文件 输出文件: 新文件模式,实现一对一的转换,它不修改原文件,会把修改后的内容写入指定的「输出文件」,不能使用通配符,默认情况下会覆盖原文件,使用 oldfile 模式。
dos2unix / unix2dos 命令示例
如下给出 dos2unix / unix2dos 的一些使用示例。
将 DOS 换行符转为 Linux 换行符
不使用任何的选项执行 dos2unix 命令,并指定文件,会将 windows 系统换行符转换为 Linux 系统换行符:
dos2unix test.txt
[!NOTE]
会把转换后的内容写入
test.txt文件,即:会覆盖原文件。
指定输出文件
使用新文件(newfile)模式 -n / --newfile INFILE OUTFILE 指定输出文件:
dos2unix -n win.txt linux.txt
该示例会把转换后的内容保存到 linux.txt 文件。
使用通配符批量转换文件
使用通配符 *,转换匹配的所有的文件:
dos2unix *.conf
Mac 格式转 Unix 格式
使用 -c mac 选项指定输入文件为 mac 格式的内容:
dos2unix -c mac macfile.txt
该示例会将 Mac 格式的 CR 换行转换为 Unix LF 换行
[!NOTE]
也可以使用 mac2unix 命令。
Unix 格式转 Windows 格式
使用 unix2dos 命令把 Unix LF 换行转换为 Windows CR + LF 换行符:
unix2dos linux.txt
查看文件换行符信息
使用 -i / --info 选项显示文件的信息:
dos2unix -i *.txt
会输出类似如下的内容:
0 4 0 no_bom text test1.txt
输出内容各列信息的解释:
- DOS 换行符的数量(CRLF)
- Unix 换行符的数量(LF)
- Mac 换行符的数量(CR)
- 字节顺序标记(BOM)
- 文件类型: 可能的取值有 text 「文本文件」、binary 「二进制文件」
- 文件名
dos2unix 命令选项详解
dos2unix 命令有非常多的选项,提供了非常丰富的功能,如下给出 dos2unix 命令的所有选项的详细解释说明:
| 选项 | 功能详细说明 |
|---|---|
-- | 后续所有的参数视为文件名,用于支持以 - 开头的文件 |
--allow-chown | 覆盖原文件时,允许修改文件的所有者,当无法保留文件的权限时不中止转换 |
--no-allow-chown | 默认不允许修改的所有者,当无法保留文件的权限时中止转换 |
-ascii | 默认的转换模式,只处理文件中的换行符,兼容 UTF-8 等 ASCII 相兼容的编码 |
-iso | 在 DOS 与 ISO-8859-1 字符集之间进行转换 |
-1252 | 使用 DOS 代码页 1252(西欧) |
-437 | 使用 DOS 代码页 437(美国,ISO 模式) |
-850 | 使用 DOS 代码页 850(西欧) |
-860 | 使用 DOS 代码页 860(葡萄牙) |
-863 | 使用 DOS 代码页 863(加拿大法语) |
-865 | 使用 DOS 代码页 865(北欧) |
-7 | 将 8 位非 ASCII 字符转为 7 位的空格 |
-b, --keep-bom | 保留字节顺序标记 BOM,当转换为 DOS 换行符时为默认值 |
-c, --convmode CONVMODE | 设置转换模式,默认值为 ascii, 可选的值有: ascii / 7bit / isoI / mac |
-D, --display-enc ENCODING | Windows 下设置控制台显示文本的编码,可选的值有: ansi/ unicode / unicodebom / utf8 / utf8bom |
-e, --add-eol | 如果文件中的最后一行没有换行符则自动添加一个换行符 |
--no-add-eol | 在文件的最后一行不自动添加换行符 |
-f, --force | 强制转换二进制文件,默认会自动跳过二进制文件 |
-gb, --gb18030 | 在 Windows 系统下将 UTF-16 转为 GB18030 编码 |
-h, --help | 显示帮助信息并退出 |
-i[FLAGS], --info[=FLAGS] FILE... | 只查看文件的信息,不转换内容,FLAGS 可选的值有: d / u / m / b / t / e / c / h / p |
-k, --keepdate | 保留原文件的时间戳 |
-L, --license | 显示软件的许可证信息 |
-l, --newline | 转换时额外增加一个空行 |
-m, --add-bom | 强制输出文件时写入 UTF-8 BOM |
-n, --newfile INFILE OUTFILE | 新文件模式,会把转换后的内容写入到 OUTFILE 文件 |
-O, --to-stdout | 输出内容到标准输出 |
-o, --oldfile FILE... | 覆盖模式(该值为默认值),会把转换后的内容写入原文件 |
-q, --quiet | 启用安静模式,不输出警告与提示信息 |
-r, --remove-bom | 移除 BOM 信息,当转换为 Unix 格式时,该值为默认行为 |
-s, --safe | 启用安全模式,跳过二进制文件,该值为默认值 |
-u, --keep-utf16 | 保持 UTF-16 编码 |
-ul, --assume-utf16le | 假设输入文件的格式为无 BOM 的 UTF-16LE |
-ub, --assume-utf16be | 假设输入文件的格式为无 BOM 的 UTF-16BE |
-v, --verbose | 输出转换过程的详细信息 |
-F, --follow-symlink | 跟随符号链接转换目标文件 |
-R, --replace-symlink | 用转换后的文件替换符号链接,原目标保持不变 |
-S, --skip-symlink | 不处理符号链接(该值为默认值) |
-V, --version | 显示版本信息并退出 |
模式详解
如下给出在 dos2unix 命令中可以使用的相关模式的详细解释说明。
Mac 模式
默认情况下,dos2unix / unix2dos 只在 DOS 换行符与 Unix 换行符之间互相转换,不会处理 Mac 格式的换行符。
启用 Mac 模式时,会在 Mac 换行符与 Unix 换行符之间转换,不会处理 DOS 换行符。
使用如下方式启用 Mac 模式:
- 使用
-c mac选项指定转换模式 - 直接使用命令
mac2unix或unix2mac
转换模式详解
dos2unix 命令提供了多种转换模式,用于控制换行符与字符编码的处理方式。
ascii 模式(默认)
- 该默认为默认模式
- 适用于 ASCII 及 UTF-8 等与 ASCII 编码兼容的编码文件
- 只转换换行符,不转换编码
- 启用后会禁用 7bit 与 iso 模式
- 启用 ascii 模式后,会禁用
-u、-ul、-ub等 UTF-16 相关的选项
7bit 模式
将所有的 8 位非 ASCII 字符转换为 7 位的空格。
iso 模式
在 DOS 代码页与 Unix ISO-8859-1(Latin-1)之间进行字符集的转换。
常用的示例有:
# DOS 默认代码页 → Unix Latin-1
dos2unix -iso -n in.txt out.txt
# DOS CP850 → Unix Latin-1
dos2unix -850 -n in.txt out.txt
# Windows CP1252 → Unix Latin-1
dos2unix -1252 -n in.txt out.txt
# Windows CP1252 → Unix UTF-8
iconv -f CP1252 -t UTF-8 in.txt | dos2unix > out.txt
# Unix Latin-1 → DOS 默认代码页
unix2dos -iso -n in.txt out.txt
Unicode 相关说明
Unicode 转换规则
- 带 BOM 的 UTF-16 文件会被自动识别
- 不带 BOM 的 UTF-16 会被识别为二进制文件,需用
-ul/-ub指定文件的编码
字节顺序标记
- Windows 程序常默认添加 BOM
- Unix 系统一般不使用 BOM
dos2unix默认不写入 BOM 信息unix2dos默认会保留输入文件的 BOM 信息-b:会保留 BOM-r:会移除 BOM-m:会强制写入 UTF-8 BOM
GB18030 编码支持
GB18030 是中国国家标准编码,兼容 ASCII、GBK 与 Unicode。
- Unix/Linux:locale 设为 GB18030 时,会将 UTF-16 自动转为 GB18030 编码
- Windows:需使用
-gb/--gb18030选项 - GB18030 文件可带 BOM,规则同 Unicode
国际化与本地化
设置 LANG 环境变量
设置界面语言,格式为:语言_地区.编码
export LANG=nl_NL
export LANG=es_ES
export LANG=en_US.iso88591
export LANG=en_GB.UTF-8
设置 LANGUAGE 环境变量
设置语言优先级,以冒号分隔:
export LANGUAGE=nl:de
指定翻译文件目录
使用 DOS2UNIX_LOCALEDIR 环境变量设置翻译目录:
export DOS2UNIX_LOCALEDIR=$HOME/share/locale
返回值
dos2unix 命令根据执行的情况,会返回如下的值:
- 成功:返回 0
- 系统错误:返回系统错误码
- 其他错误:返回 1
- 启用安静模式(
-q)时,除参数错误外一律返回 0
结语
dos2unix 是 Linux / Unix 平台处理跨平台文本格式的工具,主要用于解决换行符不兼容与编码异常的问题。