Команда Windows для преобразования окончаний строки Unix?
Есть ли команда Windows для преобразования окончаний строк файла?
У нас есть test.bat
, который нам нужно запустить, чтобы запустить наш сервер. Мы используем Perforce, и нам нужно иметь окончание строк unix в нашей рабочей области. По какой-то причине нам не разрешено изменять окончания строк для Windows в наших рабочих пространствах. Однако сервер работает в Windows.
Каждый раз, когда я должен запускать bat файл, я открываю его в Notepad ++ и выбираю Edit → EOL conversion → Windows. Есть ли способ автоматизировать это, так что нам не нужно вручную изменять окончание строки каждый раз, когда мы синхронизируемся с Perforce?
Спасибо заранее.
Ответы
Ответ 1
Это можно сделать очень легко с помощью команды more
, которая включена в Windows NT и более поздних версиях. Чтобы преобразовать input_filename
, который содержит UNIX EOL (конец строки) \n
- output_filename
, который содержит Windows EOL \r\n
, просто выполните следующее:
TYPE input_filename | MORE /P > output_filename
Команда more
имеет дополнительные параметры форматирования, о которых вы, возможно, и не подозреваете. Запустите more/?
, чтобы узнать, что еще может сделать more
.
Ответ 2
Используйте утилиту unix2dos. Вы можете скачать бинарные файлы здесь.
Ответ 3
Вы можете сделать это без дополнительных инструментов в VBScript:
Do Until WScript.StdIn.AtEndOfStream
WScript.StdOut.WriteLine WScript.StdIn.ReadLine
Loop
Поместите вышеуказанные строки в файл unix2dos.vbs
и запустите его следующим образом:
cscript //NoLogo unix2dos.vbs <C:\path\to\input.txt >C:\path\to\output.txt
или вот так:
type C:\path\to\input.txt | cscript //NoLogo unix2dos.vbs >C:\path\to\output.txt
Вы также можете сделать это в PowerShell:
(Get-Content "C:\path\to\input.txt") -replace "`n", "`r`n" |
Set-Content "C:\path\to\output.txt"
который можно было бы еще более упростить:
(Get-Content "C:\path\to\input.txt") | Set-Content "C:\path\to\output.txt"
Вышеуказанный оператор работает без явной замены, потому что Get-Content
неявно разбивает входные файлы на любой тип linebreak (CR, LF и CR-LF), а Set-Content
объединяет входной массив с разрывами строк Windows (CR- LF) перед записью в файл.
Ответ 4
Я имел дело с проблемами CRLF
поэтому я решил создать действительно простой инструмент для конвертации (в NodeJS):
Это NodeJS EOL конвертер CLI
Так что если у вас есть NodeJS с установленным npm, вы можете попробовать это:
npm i -g eol-converter-cli
eolConverter crlf "**/*.{txt,js,java,etc}"
Путь может быть настроен динамически с помощью регулярного выражения Glob (то же, что и в оболочке).
Так что, если вы можете использовать NodeJS, это действительно просто, и вы можете интегрировать эту команду для преобразования всего рабочего пространства в желаемые окончания строк.
Ответ 5
Windows 'MORE не надежна, она неизбежно разрушает TAB и добавляет строки.
unix2dos также является частью Minig/MSYS, Cygutils, GnuWin32 и других коллекций двоичных портов unix - и может быть уже установлен.
Если python, этот однострочный конвертер преобразует любые окончания строк в текущую платформу - на любой платформе:
TYPE UNIXFILE.EXT | python -c "import sys; sys.stdout.write(sys.stdin.read())" > MYPLATFILE.EXT
или
python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" UNIXFILE.EXT > MYPLATFILE.EXT
Или поместите однострочный вкладыш в .bat/shell script и на PATH в соответствии с вашей платформой:
@REM This is any2here.bat
python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" %1
и используйте этот инструмент, например
any2here UNIXFILE.EXT > MYPLATFILE.EXT
Ответ 6
Опираясь на TampaHaze и MD XF полезные ответы.
Это изменит все файлы .txt в текущем каталоге с LF на CRLF в командной строке.
for /f %f in ('dir /b "*.txt"') do ( type %f | more /p > %f.1 & move %f.1 %f )
Если вы не хотите проверять каждое изменение
переехать
к
двигаться/у
Включить подкаталоги изменить
dir/b
к
dir/b/s
Чтобы сделать все это в пакетном файле, включая подкаталоги, не предлагая использовать ниже
@echo off
setlocal enabledelayedexpansion
for /f %%f in ('dir /s /b "*.txt"') do (
type %%f | more /p > %%f.1
move /y %%f.1 %%f > nul
@echo Changing LF-^>CRLF in File %%f
)
echo.
pause
Ответ 7
попробуйте следующее:
(for /f "delims=" %i in (file.unix) do @echo %i)>file.dos
Протокол сеанса:
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..
Ответ 8
Мой вклад в это, преобразование нескольких файлов в папку:
for %%z in (*.txt) do (for /f "delims=" %%i in (%%z) do @echo %%i)>%%z.tmp
Ответ 9
Вы можете создать простой пакет script, чтобы сделать это для вас:
TYPE %1 | MORE /P >%1.1
MOVE %1.1 %1
Затем запустите <batch script name> <FILE>
и <FILE>
будет мгновенно преобразован в конец строки DOS.
Ответ 10
На основании ответа Endoro, но чтобы сохранить пробелы, попробуйте следующее:
@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
Ответ 11
Я клонировал свой проект git, используя git bash
на windows
. Все файлы имели LF
окончания. Наш репозиторий по умолчанию имеет окончания CRLF
.
Я удалил проект, а затем снова клонировал его с помощью Windows Command Prompt
. Окончания CRLF
были тогда целы. В моем случае, если бы я изменил окончание проекта, это привело бы к огромным усилиям и вызвало бы проблемы для моих товарищей по команде. Итак, сделал это так. Надеюсь, это кому-нибудь поможет.
Ответ 12
Я беру курс AWS, и мне часто приходилось копировать текстовые поля веб-форм AWS в Блокнот Windows. Таким образом, я получаю текст с разделителями LF только в своем буфере обмена. Я случайно обнаружил, что вставив его в мой редактор Delphi, а затем нажав Ctrl + K + W, мы напишем текст в файл с разделителями CR + LF. (Бьюсь об заклад, многие другие редакторы IDE сделали бы то же самое).
Ответ 13
Для преобразования UNIX (LF) в Windows (CR-LF) используйте следующую команду
type file.txt > new_file.txt
Ответ 14
Если у вас есть bash (например, git bash), вы можете использовать следующий скрипт для конвертации из unix2dos:
ex filename.ext <<EOF
:set fileformat=dos
:wq
EOF
аналогично, чтобы конвертировать из dos2unix:
ex filename.ext <<EOF
:set fileformat=unix
:wq
EOF
Ответ 15
Вставка каретки возвращается к текстовому файлу
@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