Batch file 使用CMD将文本文件中的所有CR转换为CRLF
有没有办法将文本文件中的所有CRs转换为CRLF 当我在Windows上从Linux服务器打开一个文本文件时,所有文本都显示在一行中,但实际上它是多行的 我想在批处理文件中执行转换 有人能给我一些建议吗Batch file 使用CMD将文本文件中的所有CR转换为CRLF,batch-file,cmd,newline,Batch File,Cmd,Newline,有没有办法将文本文件中的所有CRs转换为CRLF 当我在Windows上从Linux服务器打开一个文本文件时,所有文本都显示在一行中,但实际上它是多行的 我想在批处理文件中执行转换 有人能给我一些建议吗 type inputfile | find /v "" > outputfile 应该这样做类型读取输入文件并将输出传输到查找,参数匹配所有行并将它们输出到输出文件。在此过程中,LF被转换为CRLF,只要存在不止一种系统,并且迫切需要交换数据,线路分隔符和线路终端就一直是系统之间兼容性摩
type inputfile | find /v "" > outputfile
应该这样做<代码>类型读取输入文件并将输出传输到
查找
,参数匹配所有行并将它们输出到输出文件。在此过程中,LF被转换为CRLF,只要存在不止一种系统,并且迫切需要交换数据,线路分隔符和线路终端就一直是系统之间兼容性摩擦的根源。这本书对历史背景有一个很好的概述。而且,它还针对这个问题提出了各种解决方案,专门用于Unix端或Windows端
在Unix(Linux)端,查找名为unix2dos
的实用程序及其近亲dos2unix
。这些工具通常可用,可以作为商业Unix的组件,也可以作为开源工具。如果可以的话,它们是最好的答案,因为它们(通常,请参阅verson手册页了解详细信息)对意外使用两个行尾写入的文件非常小心。在这种不幸的情况下,遍历这两个实用程序通常会清理文件,使其内部保持一致。如果没有这些方便的命令,可以使用许多本机实用程序进行转换。例如,可以使用tr
命令将DOS CRLF行尾转换为Unix换行符:
$ tr -d '\r' < inputfile > outputfile
实验表明,该方法同样有效,但由于未知原因,可能无法给出相同的结果:
C:\...> FIND "" /V <filename.u >filename.txt
C:\…>FIND”“/V filename.txt
在这两种情况下,都会创建具有更改的行尾的文件副本。可能不建议在适当的位置更改文件
我将提到另一种在纸面上看起来总是很诱人的方法。当您使用Samba在Linux服务器上提供文件系统共享以供Windows装载时,您可以为共享设置一个配置选项,以“文本模式”装载它。在“文本模式”中装入的共享会自动转换行尾。如果它对你有效,那可能是最干净的解决方案。这两个系统都使用他们喜欢的文本文件格式,而且都不必对此大惊小怪。但是仔细测试,这个解决方案充满了边缘情况和陷阱。最重要的是,不要期望文本模式文件系统装入点上的二进制文件能够正确读取。在Windows XP及更早版本中,您只需在Dos Edit(或Windows Edit)中打开并保存文本文件,即可将其转换为CRLF。不幸的是,在Vista中删除了编辑程序。一种荒谬的方式。适用于以下场景:
cat file | perl -pe 's/\R/\n/g'
如果以下批次片段成功,则结束:
del outputfile
for /f "delims=" %%x in (inputfile) do echo %%x>>outputfile
它的优点是不依赖于
find
程序,该程序相当易变(在我测试其他解决方案的某些机器上挂起或不起作用)。一种可能但相当麻烦的方法是使用,如果我没记错的话,它是一种从过去的Windows XP中固有包含的可执行文件。下面是一个可能的脚本(我们称之为conveol.bat
;请参阅代码中的所有解释性rem
注释):
@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“_IFILE=%~1”&rem//(输入文件;第一个命令行参数)
设置“_OFILE=%~2”&rem//(输出文件;第二个命令行参数)
设置“_IEOL=0d”&rem//(进线中断;`0d`或`0a`)
设置“\u OEOL=0d 0a”&rem//(出线中断;`0d`、`0a`、`0d 0a`、`)
设置“\u TFILE1=%TEMP%\%~n0\u%RANDOM%.hex”&rem/(第一个临时文件)
设置“\u TFILE2=%TEMP%\%~n0\u%RANDOM%.tmp”&rem/(第二个临时文件)
rem//验证输入文件:
<“%_i文件%”rem/| |退出/B
rem//将输入文件转换为十六进制值(第一个临时文件):
CertUtil-f-encodehex“%\u IFILE%”“%\u TFILE1%”4>nul
rem//写入第二个临时文件:
>“%\u TFILE2%”(
setlocal EnableDelayedExpansion
rem//逐行读取第一个临时文件:
对于/F“usebackq delims=“%%L in(!\u TFILE1!”)执行以下操作(
rem/*存储当前行(十六进制值),然后替换换行符
rem使用给定的换行代码并返回结果:*/
设置“行=%%L”&回显(!行:%%\u IEOL%%=%%\u OEOL%!
)
端部
)
rem//验证输出文件:
>“%_文件%”rem/| |退出/B
rem//将第二个临时文件转换回文本到输出文件:
CertUtil-f-decodeChex“%\u TFILE2%”“%\u of ile%”4>nul
rem//清理临时文件:
删除“%”文件1%“”%\u文件2%
端部
退出/B
将输入文件作为第一个命令行参数提供给脚本,将输出文件作为第二个命令行参数提供给脚本(它们甚至可能相等):
conv-eol.bat“input file.txt”“output file.txt”
输入和输出换行符必须指定为十六进制字符代码,0d
表示回车符(CR)和换行符(LF)
下表说明了如何在脚本顶部为不同换行样式转换任务设置变量\u IEOL
和\u OEOL
:
del outputfile
for /f "delims=" %%x in (inputfile) do echo %%x>>outputfile