如何将DOS/Windows的换行符(CRLF)转换为Unix的换行符(LF)
如何将DOS/Windows的换行符(CRLF)转换为Unix的换行符(LF)
如何以编程方式(不使用 vi
)将 DOS/Windows 换行符转换为 Unix 换行符?
在某些系统上,没有可用的 dos2unix
和 unix2dos
命令。
如何使用诸如 sed
、awk
和 tr
等命令来模拟它们?
admin 更改状态以发布 2023年5月25日
使用:
tr -d "\r" < file
查看 这里 有关使用 sed
的示例:
# In a Unix environment: convert DOS newlines (CR/LF) to Unix format. sed 's/.$//' # Assumes that all lines end with CR/LF sed 's/^M$//' # In Bash/tcsh, press Ctrl-V then Ctrl-M sed 's/\x0D$//' # Works on ssed, gsed 3.02.80 or higher # In a Unix environment: convert Unix newlines (LF) to DOS format. sed "s/$/`echo -e \\\r`/" # Command line under ksh sed 's/$'"/`echo \\\r`/" # Command line under bash sed "s/$/`echo \\\r`/" # Command line under zsh sed 's/$/\r/' # gsed 3.02.80 or higher
使用 sed -i
进行原地转换,例如:sed -i 's/..../' file
。
你可以使用 tr
将 DOS 转换为 Unix;但前提是你的文件中 CR 字符只能作为 CRLF 字节对的第一个字节出现。这通常是这种情况。你可以使用:
tr -d '\015'UNIX-file
请注意,DOS-file
的名称与 UNIX-file
的名称不同;如果你尝试两次使用相同的名称,你将得到空文件。
你无法使用标准的 'tr' 进行相反的转换。
如果你知道如何在脚本中输入回车符 (control-V,control-M 输入 control-M),那么:
sed 's/^M$//' # DOS to Unix sed 's/$/^M/' # Unix to DOS
其中 '^M' 是控制字符 M。你还可以使用 bash
的 ANSI-C 引用 机制来指定回车符:
sed $'s/\r$//' # DOS to Unix sed $'s/$/\r/' # Unix to DOS
但是,如果你需要经常这样做 (粗略地说,超过一次),最好安装转换程序 (如 dos2unix
和 unix2dos
,或者 dtou
和 utod
) 并使用它们。
如果你需要处理整个目录和子目录,你可以使用 zip
:
zip -r -ll zipfile.zip somedir/ unzip zipfile.zip
这将创建一个 zip 存档,将行结束符从 CRLF 更改为 CR。unzip
然后将转换后的文件放回原位置 (并逐个请求你去解压 - 你可以回答:全部都是 Yes)。感谢 @vmsnomad 指出了这一点。