use*_*060 10 cmd newline batch-file
有没有办法将所有CR转换为文本文件中的CRLF?
当我在Windows上从Linux服务器打开文本文件时,所有文本都显示在一行中,但实际上它是多行文本.
我想在批处理文件中执行转换.
有人可以建议吗?
RBe*_*eig 14
只要存在多种系统和交换数据的冲动,行分隔符和行终止符就是系统之间兼容性摩擦的来源.关于Newline的维基百科文章对历史背景有一个很好的概述.并且,它提出了针对此问题的各种解决方案,专门用于Unix端或Windows端.
在Unix(Linux)端,查找名为的实用程序unix2dos及其近亲dos2unix.这些通常可用,作为商业Unix的组件或作为开源工具.如果可用的话,它们是最好的答案,因为它们(通常,请参阅本章的手册页以获取详细信息)对于使用两个行结尾意外写入的文件都要小心.在那个不幸的情况下,通过两个实用程序的旅行通常会清理文件内部一致.如果没有这些方便的命令,可以使许多本机实用程序进行转换.例如,可以使用以下tr命令将DOS CRLF行结尾转换为Unix换行符:
$ tr -d '\r' < inputfile > outputfile
Run Code Online (Sandbox Code Playgroud)
但请注意,该命令假定所有行都由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
Run Code Online (Sandbox Code Playgroud)
实验表明这也有效,但由于未知原因,它可能无法给出相同的结果:
C:\...> FIND "" /V <filename.u >filename.txt
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,您都可以使用更改的行结尾创建文件的副本.可能不建议更改文件.
我会提到另外一种看起来很诱人的方法.当您使用Samba在Linux服务器上提供文件系统共享以供Windows安装时,您可以为在"文本模式"下安装它的共享设置一个配置选项.以"文本模式"安装的共享会自动转换行结尾.如果它适合您,那可能是最干净的解决方案.两个系统都使用他们喜欢的文本文件格式,并且都不必大惊小怪.但仔细测试,这个解决方案充满了边缘案例和陷阱.最重要的是,不要指望文本模式文件系统挂载点上的二进制文件能够正确读取.他们经常会,但不一定总是.
type inputfile | find /v "" > outputfile
Run Code Online (Sandbox Code Playgroud)
应该这样做.type读取输入文件和管道输出到find参数以匹配所有行并将它们输出到输出文件.在此过程中,LF被转换为CRLF