Команда 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