it-swarm.com.ru

Команда Windows для преобразования концов строки Unix?

Есть ли команда Windows для преобразования концов строк файла?

У нас есть test.bat, который нам нужно запустить, чтобы запустить наш сервер. Мы используем Perforce, и у нас должно быть окончание строки Unix в нашей рабочей области. По какой-то причине нам не разрешено изменять окончания строк на Windows в наших рабочих пространствах. Тем не менее, сервер работает на Windows.

Каждый раз, когда мне нужно запустить файл bat, я открываю его в Notepad ++ и выбираю «Правка» → «Преобразование EOL» → «Windows». Есть ли способ автоматизировать это, чтобы нам не нужно было вручную изменять окончания строк при каждой синхронизации с Perforce?

Заранее спасибо.

58
Deepti Jain

На самом деле это можно сделать очень легко с помощью команды more, которая включена в Windows NT и более поздние версии. Чтобы преобразовать input_filename, который содержит UNIX EOL (конец строки) \n, в output_filename, который содержит Windows EOL \r\n, просто сделайте следующее:

TYPE input_filename | MORE /P > output_filename

Команда more имеет дополнительные параметры форматирования, о которых вы можете не знать. Запустите more/?, чтобы узнать, что еще может делать more

54
TampaHaze

Используйте unix2dos утилиту. Вы можете скачать двоичные файлы здесь .

26
David Jashi

Вы можете сделать это без дополнительных инструментов в 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 неявно разделяет входные файлы на любой тип перевода строки (CR, LF и CR-LF), а Set-Content объединяет входной массив с переносом строки Windows (CR-LF) перед записью его в файл.

15
Ansgar Wiechers

Windows НЕ БОЛЬШЕ ненадежна, она неизбежно уничтожает вкладки и добавляет строки.

unix2dos также является частью MinGW/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 и в PATH в соответствии с вашей платформой:

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

и использовать этот инструмент, как

any2here UNIXFILE.EXT > MYPLATFILE.EXT
10
kxr

Я имел дело с проблемами CRLF, поэтому я решил создать действительно простой инструмент для конвертации (в NodeJS):

Это NodeJS EOL конвертер CLI

Так что если у вас есть NodeJS с установленным npm, вы можете попробовать это:

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

Путь может быть настроен динамически с помощью регулярного выражения Glob (то же, что и в Shell).

Так что если вы можете использовать NodeJS, это действительно просто, и вы можете интегрировать эту команду для преобразования всего рабочего пространства в желаемые окончания строк.

6
Jurosh

Опираясь на полезные ответы 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
6
uosjead

попробуй это:

(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> (для/f "delims ="% i в (file.unix) do @echo% i)> файле. 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 ..
5
Endoro

Мой вклад в это, конвертирование нескольких файлов в папку: for %%z in (*.txt) do (for /f "delims=" %%i in (%%z) do @echo %%i)>%%z.tmp

3
Ricardo

Вы можете создать простой пакетный скрипт, чтобы сделать это для вас:

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

Затем запустите <batch script name> <FILE> и <FILE> будут мгновенно преобразованы в окончания строки DOS.

1
MD XF

Исходя из ответа Эндоро, но, чтобы сохранить пробелы, попробуйте это:

@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
1
Ir Relevant

Я клонировал свой проект git, используя git bash на windows. Все файлы имели окончание LF. Наш репозиторий имеет CRLF окончания по умолчанию.

Я удалил проект, а затем снова клонировал его, используя Windows Command Prompt. Окончания CRLF были тогда нетронуты. В моем случае, если бы я изменил окончание проекта, это привело бы к огромным усилиям и вызвало бы проблемы для моих товарищей по команде. Итак, сделал это так. Надеюсь, это кому-нибудь поможет. 

0
retr0

Я беру курс AWS, и мне часто приходилось копировать текстовые поля веб-форм AWS в Блокнот Windows. Таким образом, я получаю текст с разделителями LF только в своем буфере обмена. Я случайно обнаружил, что вставив его в мой редактор Delphi, а затем нажав Ctrl + K + W, мы напишем текст в файл с разделителями CR + LF. (Бьюсь об заклад, многие другие редакторы IDE сделали бы то же самое).

0
RHenningsgard