只要存在不止一种系统和交换数据的冲动,线路分隔符和线路终结器就一直是系统之间兼容性摩擦的根源。 Wikipedia article on the Newline 对历史背景有一个不错的概述。并且,它针对这个问题提出了多种解决方案,专门用于 Unix 端或 Windows 端。
在 Unix (Linux) 端,查找名为 unix2dos 及其近亲 dos2unix 的实用程序。这些都是常见的,可以作为商业 Unix 的一个组件,也可以作为开源工具。如果可用,它们是最好的答案,因为它们(通常,请参阅您的版本的手册页了解详细信息)对意外写入两个行尾的文件非常小心。在那种不幸的情况下,通过这两个实用程序通常会清理文件以保持内部一致。在没有这些方便的命令的情况下,可以使用许多本机实用程序来进行转换。例如,可以使用tr 命令将 DOS CRLF 换行符转换为 Unix 换行符:
$ tr -d '\r' < inputfile > outputfile
但请注意,此命令假定所有行都由 CRLF(或 LFCR)终止,并且通过简单地从输入中删除每个 CR 字符来工作。任何裸露的 CR 字符都将丢失。
在 DOS 和 Windows 方面,它曾经很暗淡。 unix2dos 和dos2unix 的端口肯定存在,例如它们包含在更多更大的Cygwin 工具中,这些工具在Windows 机器上提供了完整的unix 仿真。但是很难找到仅使用内置功能的解决方案。
不过,现代 Windows(可能从 Windows XP 开始)更好。在那里,内置的 FIND 命令对行终止符的选择比以前少了很多,并且可以用来进行从 Unix 行结尾到 DOS 结尾的所需转换。上面引用的 Wiki 页面给出了这个秘诀:
C:\...> TYPE filename.u | FIND "" /V >filename.txt
实验表明这也有效,但由于未知原因,它可能不会给出相同的结果:
C:\...> FIND "" /V <filename.u >filename.txt
在这两种情况下,您都会创建一个带有更改的行尾的文件副本。可能不建议更改文件。
我将提到另一种在纸面上看起来总是很诱人的方法。当您使用 Samba 在 Linux 服务器上提供文件系统共享以供 Windows 挂载时,您可以为共享设置一个配置选项,以“文本模式”挂载它。以“文本模式”挂载的共享会自动转换行尾。如果它适合您,那可能是最干净的解决方案。两个系统都使用他们喜欢的文本文件格式,而且都不必大惊小怪。但仔细测试,这个解决方案充满了边缘情况和陷阱。最重要的是,不要期望文本模式文件系统挂载点上的二进制文件能够正确读取。他们经常会,但不一定总是。