Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 使用CMD将文本文件中的所有CR转换为CRLF_Batch File_Cmd_Newline - Fatal编程技术网

Batch file 使用CMD将文本文件中的所有CR转换为CRLF

Batch file 使用CMD将文本文件中的所有CR转换为CRLF,batch-file,cmd,newline,Batch File,Cmd,Newline,有没有办法将文本文件中的所有CRs转换为CRLF 当我在Windows上从Linux服务器打开一个文本文件时,所有文本都显示在一行中,但实际上它是多行的 我想在批处理文件中执行转换 有人能给我一些建议吗 type inputfile | find /v "" > outputfile 应该这样做类型读取输入文件并将输出传输到查找,参数匹配所有行并将它们输出到输出文件。在此过程中,LF被转换为CRLF,只要存在不止一种系统,并且迫切需要交换数据,线路分隔符和线路终端就一直是系统之间兼容性摩

有没有办法将文本文件中的所有CRs转换为CRLF

当我在Windows上从Linux服务器打开一个文本文件时,所有文本都显示在一行中,但实际上它是多行的

我想在批处理文件中执行转换

有人能给我一些建议吗

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'
  • 每行末尾都有CR的文本文件
  • 文本文件,在行尾有一组重复的CR,后跟一个带有CRLF的空行。祝你好运 在记事本++(免费应用程序)中打开文件,并设置“查看->所有字符”

    如果所有线路均以CR结尾,则:

  • 在MicrosoftWordPad-NOT-Word中打开并以MSDOS格式保存文件。 否则,如果行以CR结尾,后跟以CRLF结尾的空行,则
  • 首先用记事本+ +删除空白行。转到编辑->行操作->删除空行并保存文件
  • 在Microsoft写字板中打开文件并以MSDOS格式保存

  • 如果以下批次片段成功,则结束:

    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