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

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

10.07.2013 11:42:51 Просмотров 32 Источник

Существует ли команда Windows для преобразования окончаний строк файла?

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

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

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

У вопроса есть решение - Посмотреть?

Ответы - Команда Windows для преобразования окончаний строк Unix? / Windows command to convert Unix line endings?

David Jashi

10.07.2013 11:48:00

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

https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/17579644#comment25582242_17579644
Опять же, это просто альтернатива notepad++. На самом деле это не будет автоматизировано. Мне придется запустить этот инструмент. Я действительно изменяю окончания строк в notepad++ на данный момент.
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/17579644#comment25582333_17579644
Это инструмент командной строки. И это больше подходит для автоматизации, чем инструменты GUI. Вы можете написать периодическое atjob, которое фильтрует все файлы в некоторой папке, в которую вы помещаете свои пакетные файлы. Все зависит от того, что вы подразумеваете под автоматизацией.
Jimmy Smith

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
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/17580089#comment25582311_17580089
На самом деле, это сработало бы, если бы он просто использовал что-то вроде (for /f "tokens=*" %%a in (%~1) do @echo.%%a)>"%~2".
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/17580089#comment25583853_17580089
@AnsgarWiechers Да, этот set TargetFile=%2 rem c:\test\out.txtтакже нуждается в улучшении. И, кстати, ваши "tokens=*"тоже.
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/17580089#comment25610615_17580089
@Endoro REM-это комментарий в пакетном файле, вы можете вынуть %1 rem и затем дать ему нужный вам файл. Поскольку я предоставил ссылку, я не чувствовал необходимости в дальнейшем документировании, поскольку вы уже работали с пакетным файлом, правильно? Пожалуйста, проверьте его, как он работает, и он может быть интегрирован в существующие пакетные файлы по желанию. Спасибо!
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/17580089#comment25614962_17580089
Отлично работает для меня в Windows 7. Я создал файл c:\test\test.txt, с EOL из Unix, в Notepad++. После этого я просто запустил пакетный файл. Опять же, это не мой код, это код, который я слегка изменил, чтобы не отображать Блокнот? Я могу показать оператору, как заставить его работать, в отличие от этого последнего комментария.
Ansgar Wiechers

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) перед записью его в файл.

https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/17580505#comment85636384_17580505
@FranklinYu с помощью PowerShell можно записать измененное содержимое обратно в тот же файл (скобки вокруг Get-Contentделают это возможным). Что касается редактирования" на месте " в целом: смотрите здесь .
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/17580505#comment92161667_17580505
Для этого первого метода powershell с-replace вам придется добавить параметр-raw, чтобы получить-content, чтобы сделать то, что вы намереваетесь. Только не делайте этого дважды в одном файле. Вам даже не нужно цитировать имена файлов. Обратите внимание, что использование ">" или "из файла" в поисковой оболочки PowerShell 5 в файле "Юникод" закодирован против "Анси".
Endoro

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..
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/17580965#comment31644483_17580965
Это работает, но также, кажется, удаляет все пустые строки из файла. :(
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/17580965#comment31658246_17580965
@MarioVilas да, вы правы. Вы можете использовать флип для этого.
Ricardo

08.11.2013 02:22:24

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

Ir Relevant

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
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/25206483#comment45940571_25206483
Решение IRR работает нормально, за исключением того, что он сбрасывает все восклицательные знаки (!).
TampaHaze

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можно сделать.

https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/27844521#comment56443053_27844521
это все еще отлично работает в Windows 9, спасибо! Возможно, стоит упомянуть, что файл output_filename должен существовать до запуска этой команды, и его содержимое будет перезаписано.
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/27844521#comment58589168_27844521
Это, кажется, добавляет дополнительную новую строку к файлам, которые не заканчиваются новой строкой, просто предупреждает, если это имеет значение для вашего конкретного сценария.
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/27844521#comment69785425_27844521
К сожалению, это также портит все вкладки в пробелы.
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/27844521#comment71434202_27844521
Мне нужна противоположность этому. есть идеи?
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/27844521#comment73205813_27844521
Отличный ответ! Немного проще: more /P <input_file >output_file
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/27844521#comment74830230_27844521
@Sebastian что такое Windows 9?
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/27844521#comment78927608_27844521
@adrianTNT, вы TYPE input_file | MORE /P > input_file
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/27844521#comment85577263_27844521
@AndrewSteitz он хотел провести конвертацию на месте.
https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/27844521#comment85613809_27844521
@FranklinYu, вы правы. Сначала я был озадачен вашим комментарием, а потом понял, что в моем предыдущем комментарии я забыл "?"потому что я спрашивал (очень плохо), действительно ли он набрал это в командной строке. Дох! Я спрашивал (Ну, хотел спросить) его, потому что был уверен, что это сработает, и даже пытался быть уверенным на 100%. Пунктуация имеет значение (и я дурачился). Мне нравится пример: "можно нам поесть, бабушка?"против" мы можем съесть бабушку?(1-й, спроси бабушку, можно ли нам поесть. 2-й, спрашивая кого-то еще, можем ли мы съесть бабушку, ЛОЛ). Спасибо, что указали на мою ошибку, чтобы я мог прояснить!!!
kxr

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
MD XF

10.05.2017 08:20:24

Для этого можно создать простой пакетный скрипт:

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

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

Jurosh

28.06.2017 05:45:02

Я имел дело с CRLF

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

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

https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/44805771#comment78271979_44805771
Похоже, твое решение сработало. reddit.com/r/programmingcirclejerk/comments/6t3kel/…
uosjead

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
retr0

22.08.2018 02:01:46

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

https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/51965407#comment101029947_51965407
Есть способ использовать git для преобразования CRLF в LF я просто использовал ваш подход, чтобы получить окончание LF, но я не могу заставить его работать. поэтому я решил изменить git configs вот фрагмент: $ git config --global core.вход autocrlf
RHenningsgard

12.04.2019 11:24:18

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

user3862043

04.09.2019 04:42:09

Для преобразования UNIX (LF) в Windows (CR-LF) используйте следующую команду

type file.txt > new_file.txt
Stephen Quan

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
Jean-François Larvoire

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 считывается непосредственно из входного файла.)

https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings/59876636#comment105889124_59876636
Это отбрасывает все двоеточия :от начала строки. Это уничтожает все пакетные функции. Кстати. Тест для преобразования файла со строкой типа \..\..\windows\system32\calc.exeотлично . Чтобы решить эту проблему, посмотрите на это объяснение
jeb

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!и внешняя скобка позволяет избежать случайных пробелов в конце строки.

Закрыть X