Windows command to convert Unix line endings?

匿名 (未验证) 提交于 2019-12-03 02:11:02

问题:

Is there a Windows command to convert line endings of a file?

We have a test.bat which we need to run to start our server. We use Perforce and we need to have unix line endings in our workspace. For some reason, we are not allowed to change line endings to Windows in our workspaces. However, the server runs on Windows.

Everytime I have to run the bat file, I open it in Notepad++ and choose Edit→EOL conversion→Windows. Is there a way to automate this so that we won't need to manually change the line endings everytime we sync with Perforce?

Thanks in advance.

回答1:

This can actually be done very easily using the more command which is included in Windows NT and later. To convert input_filename which contains UNIX EOL (End Of Line) \n to output_filename which contains Windows EOL \r\n, just do this:

TYPE input_filename | MORE /P > output_filename

The more command has additional formatting options that you may not be aware of. Run more/? to learn what else more can do.



回答2:

Use unix2dos utility. You can download binaries here.



回答3:

You can do this without additional tools in VBScript:

Do Until WScript.StdIn.AtEndOfStream   WScript.StdOut.WriteLine WScript.StdIn.ReadLine Loop

Put the above lines in a file unix2dos.vbs and run it like this:

cscript //NoLogo unix2dos.vbs <C:\path\to\input.txt >C:\path\to\output.txt

or like this:

type C:\path\to\input.txt | cscript //NoLogo unix2dos.vbs >C:\path\to\output.txt

You can also do it in PowerShell:

(Get-Content "C:\path\to\input.txt") -replace "`n", "`r`n" |   Set-Content "C:\path\to\output.txt"

which could be further simplified to this:

(Get-Content "C:\path\to\input.txt") | Set-Content "C:\path\to\output.txt"

The above statement works without an explicit replacement, because Get-Content implicitly splits input files at any kind of linebreak (CR, LF, and CR-LF), and Set-Content joins the input array with Windows linebreaks (CR-LF) before writing it to a file.



回答4:

Windows' MORE is not reliable, it destroys TABs inevitably and adds lines.

unix2dos is part also of MinGW/MSYS, Cygutils, GnuWin32 and other unix binary port collections - and may already be installed.

When python is there, this one-liner converts any line endings to current platform - on any platform:

TYPE UNIXFILE.EXT | python -c "import sys; sys.stdout.write(sys.stdin.read())" > MYPLATFILE.EXT

or

python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" UNIXFILE.EXT > MYPLATFILE.EXT

Or put the one-liner into a .bat / shell script and on the PATH according to your platform:

@REM This is any2here.bat python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" %1

and use that tool like

any2here UNIXFILE.EXT > MYPLATFILE.EXT


回答5:

try this:

(for /f "delims=" %i in (file.unix) do @echo %i)>file.dos

Session protocol:

C:\TEST>xxd -g1 file.unix 0000000: 36 31 36 38 39 36 32 39 33 30 38 31 30 38 36 35  6168962930810865 0000010: 0a 34 38 36 38 39 37 34 36 33 32 36 31 38 31 39  .486897463261819 0000020: 37 0a 37 32 30 30 31 33 37 33 39 31 39 32 38 35  7.72001373919285 0000030: 34 37 0a 35 30 32 32 38 31 35 37 33 32 30 32 30  47.5022815732020 0000040: 35 32 34 0a                                      524.  C:\TEST>(for /f "delims=" %i in (file.unix) do @echo %i)>file.dos  C:\TEST>xxd -g1 file.dos 0000000: 36 31 36 38 39 36 32 39 33 30 38 31 30 38 36 35  6168962930810865 0000010: 0d 0a 34 38 36 38 39 37 34 36 33 32 36 31 38 31  ..48689746326181 0000020: 39 37 0d 0a 37 32 30 30 31 33 37 33 39 31 39 32  97..720013739192 0000030: 38 35 34 37 0d 0a 35 30 32 32 38 31 35 37 33 32  8547..5022815732 0000040: 30 32 30 35 32 34 0d 0a                          020524..


回答6:

My contribution for this, converting several files in a folder: for %%z in (*.txt) do (for /f "delims=" %%i in (%%z) do @echo %%i)>%%z.tmp



回答7:

I was dealing with CRLF issues so I decided to build really simple tool for conversion (in NodeJS):

It's NodeJS EOL converter CLI

So if you have NodeJS with npm installed you can try it:

npm i -g eol-converter-cli eolConverter crlf "**/*.{txt,js,java,etc}"

Path might be configured dynamically by using Glob regex (same regex as in shell).

So if you can use NodeJS, it's really simple and you can integrate this command to convert whole workspace to desired line endings.



回答8:

Based on Endoro's answer but to keep the blanks, try this:

@echo off setlocal enabledelayedexpansion (for /f "tokens=* delims=:" %%i in ('findstr /n "^" file.unix') do (         set line=%%i         set line=!line:*:=!         echo(!line!         ))>file.dos


回答9:

You could create a simple batch script to do this for you:

TYPE %1 | MORE /P >%1.1 MOVE %1.1 %1

Then run <batch script name> <FILE> and <FILE> will be instantly converted to DOS line endings.



回答10:

Inserting Carriage Returns to a Text File

@echo off set SourceFile=%1 rem c:\test\test.txt set TargetFile=%2 rem c:\test\out.txt  if exist "%TargetFile%" del "%TargetFile%" for /F "delims=" %%a in ('type "%SourceFile%"') do call :Sub %%a rem notepad "%TargetFile%" goto :eof   :Sub echo %1 >> "%TargetFile%" if "%2"=="" goto :eof shift goto sub


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!