Команда Windows для преобразования окончаний строк Unix?
Существует ли команда Windows для преобразования окончаний строк файла?
У нас есть test.bat
мышь, которую нам нужно запустить, чтобы запустить наш сервер. Мы используем Perforce, и нам нужно иметь окончания строк unix в нашем рабочем пространстве. По какой-то причине нам не разрешается менять окончания строк на окна в наших рабочих пространствах. Однако сервер работает на Windows.
Каждый раз, когда мне нужно запустить файл bat, я открываю его в Notepad++ и выбираю Edit→EOL conversion→Windows. Есть ли способ автоматизировать это, чтобы нам не нужно было вручную изменять окончания строк каждый раз, когда мы синхронизируемся с Perforce?
Заранее спасибо.
Ответы - Команда Windows для преобразования окончаний строк Unix? / Windows command to convert Unix line endings?

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


at
job, которое фильтрует все файлы в некоторой папке, в которую вы помещаете свои пакетные файлы. Все зависит от того, что вы подразумеваете под автоматизацией.

11.07.2013 12:15:32
Вставка каретки возвращает текстовый файл
@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

(for /f "tokens=*" %%a in (%~1) do @echo.%%a)>"%~2"
.

set TargetFile=%2 rem c:\test\out.txt
также нуждается в улучшении. И, кстати, ваши "tokens=*"
тоже.



11.07.2013 12:42:34
Вы можете сделать это без дополнительных инструментов в 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 linebreaks (CR-LF) перед записью его в файл.

Get-Content
делают это возможным). Что касается редактирования" на месте " в целом: смотрите здесь .


11.07.2013 01:11:56
попробовать это:
(for /f "delims=" %i in (file.unix) do @echo %i)>file.dos
Протокол сеанса:
C:\TEST>файл xxd-g1.юникс 0000000: 36 31 36 38 39 36 32 39 33 30 38 31 30 38 36 35 6168962930810865 0000010: 0а 34 38 36 38 39 37 34 36 33 32 36 31 38 31 39 .486897463261819 0000020: 37 0а 37 32 30 30 31 33 37 33 39 31 39 32 38 35 7.72001373919285 0000030: 34 37 0а 35 30 32 32 38 31 35 37 33 32 30 32 30 47.5022815732020 0000040: 35 32 34 0а 524. C:\TEST>(for /f "delims=" %i in (file.unix) do @echo %i) > файл.ДОС C:\TEST>файл xxd-g1.ДОС 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..Семьсот двадцать миллиардов тринадцать миллионов семьсот тридцать девять тысяч сто девяносто два 0000030: 38 35 34 37 0d 0a 35 30 32 32 38 31 35 37 33 32 8547..Пять миллиардов двадцать два миллиона восемьсот пятнадцать тысяч семьсот тридцать два 0000040: 30 32 30 35 32 34 0d 0a 020524..



08.08.2014 07:02:45
Основываясь на ответе Эндоро, но чтобы сохранить пробелы, попробуйте это:
@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


08.01.2015 07:08:45
Это на самом деле может быть сделано очень легко с помощью команды more
, которая включена в Windows NT и более поздних версиях. Чтобы преобразовать input_filename
, который содержит UNIX EOL (конец строки) \n
в output_filename
, который содержит Windows EOL \r\n
, просто сделайте это:
TYPE input_filename | MORE /P > output_filename
Команда more
имеет дополнительные параметры форматирования, о которых вы можете не знать. Работать more/?
чтобы узнатьmore
можно сделать.





more /P <input_file >output_file


TYPE input_file | MORE /P > input_file



27.02.2016 12:11:29
Windows ' MORE ненадежна, она неизбежно разрушает вкладки и добавляет строки.
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
Или положить однострочный В а .летучая мышь / shell-скрипт, и на путь в зависимости от вашей платформы:
@REM This is any2here.bat
python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" %1
и использовать этот инструмент, как
any2here UNIXFILE.EXT > MYPLATFILE.EXT


28.06.2017 05:45:02
Я имел дело с CRLF
Путь может быть динамически настроить с помощью Глоб регулярных выражений (regex как же в оболочке).
Поэтому, если вы можете использовать NodeJS, это действительно просто, и вы можете интегрировать эту команду, чтобы преобразовать все рабочее пространство в нужные окончания строк.


03.05.2018 03:32:06
Основываясь на полезных ответах TampaHaze и MD XF.
Это все изменит .txt файлы на месте в текущем каталоге от from LF до CRLF в командной строке
for /f %f in ('dir /b "*.txt"') do ( type %f | more /p > %f.1 & move %f.1 %f )
Если вы не хотите проверять каждое изменение
двигаться
К
перемещение /y
Чтобы включить изменение подкаталогов
реж. / б
К
реж. / б /с
Чтобы сделать все это в пакетном файле включая подкаталоги без запроса используйте ниже
@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

22.08.2018 02:01:46
Я клонировал свой проект git, используя git bash
на windows
. Все файлы, затем LF
окончаний. По умолчанию в нашем репозитории есть CRLF
. Windows Command Prompt
CRLF были целы. В моем случае, если бы я изменил концовки для проекта, то это привело бы к огромному коммиту и вызвало бы проблемы для моих товарищей по команде. Итак, сделали это таким образом. Надеюсь, это кому-нибудь поможет.


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

04.09.2019 04:42:09
Для преобразования UNIX (LF) в Windows (CR-LF) используйте следующую команду
type file.txt > new_file.txt

04.10.2019 12:48:01
Если у вас есть bash (например, git bash), вы можете использовать следующий скрипт для преобразования из unix2dos:
ex filename.ext <<EOF
:set fileformat=dos
:wq
EOF
аналогично, для преобразования из dos2unix:
ex filename.ext <<EOF
:set fileformat=unix
:wq
EOF

23.01.2020 01:42:13
Вот простой unix2dos.bat-файл, сохраняющий пустые строки и восклицательные знаки:
@echo off
setlocal DisableDelayedExpansion
for /f "tokens=1,* delims=:" %%k in ('findstr /n "^" %1') do echo.%%l
Вывод идет на стандартный выход, поэтому перенаправьте unix2dos.вывод bat в файл, если это необходимо.
Это позволяет избежать ловушек других ранее предложенных решений для / F пакетного цикла путем:
1) Работа с отложенным расширением выключена, чтобы избежать съедания восклицательных знаков.
2) Использование самого маркера for /f для удаления номера строки из выходных строк findstr /n.
(Используя findstr /n, необходимо также получить пустые строки: они будут удалены, если for /f считывается непосредственно из входного файла.)

:
от начала строки. Это уничтожает все пакетные функции. Кстати. Тест для преобразования файла со строкой типа \..\..\windows\system32\calc.exe
отлично . Чтобы решить эту проблему, посмотрите на это объяснение

23.01.2020 04:42:01
Опоздал на вечеринку, но до сих пор нет правильного ответа с использованием цикла FOR /F
(Но вам не нужен цикл FOR вообще, решение от @TampaHaze тоже работает и намного проще)
Ответ от @IR relevant имеет некоторые недостатки.
Он отбрасывает восклицательные знаки, а также может отбрасывать каретки.
@echo off
(
setlocal Disabledelayedexpansion
for /f "tokens=* delims=" %%L in ('findstr /n "^" "%~1"') do (
set "line=%%L"
setlocal enabledelayedexpansion
set "line=!line:*:=!"
(echo(!line!)
endlocal
)
) > file.dos
Фокус в том, чтобы использовать findstr /n
для префикса каждой строки с <line number>:
, это позволяет избежать пропуска пустых строк или строк, начинающихся с ;
.
Для удаления <number>:
параметр FOR "tokens=1,* delims=:"
использовать нельзя, так как это приведет к удалению всех ведущих двоеточий в строке.
Таким образом, порядковый номер удаляется путем set "line=!line:*:=!"
, это требует EnableDelayedExpansion.
Но с EnableDelayedExpansion
набор строк set "line=%%L"
отбросит все восклицательные знаки, а также знаки препинания (только когда в строке находятся экскламы).
Вот почему я отключаю отложенное расширение раньше и включаю его только для двух линий, где это требуется.
The (echo(!line!)
выглядит странно, но имеет то преимущество, что echo(
может отображать любой контент в !line!
и внешняя скобка позволяет избежать случайных пробелов в конце строки.