首页>教程>Linux 命令手册> 文件内容查看与处理 >Linux dos2unix 命令 - windows 与 Linux 文本格式互转与编码转换

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 系统的各发行版中,一般没有预装 dos2unixunix2dos 命令,这两个命令同在 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 ENCODINGWindows 下设置控制台显示文本的编码,可选的值有: 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 模式:

  1. 使用 -c mac 选项指定转换模式
  2. 直接使用命令 mac2unixunix2mac

转换模式详解

dos2unix 命令提供了多种转换模式,用于控制换行符与字符编码的处理方式。

ascii 模式(默认)

  • 该默认为默认模式
  • 适用于 ASCII 及 UTF-8 等与 ASCII 编码兼容的编码文件
  • 只转换换行符,不转换编码
  • 启用后会禁用 7bitiso 模式
  • 启用 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 平台处理跨平台文本格式的工具,主要用于解决换行符不兼容与编码异常的问题。