Unix переводы строк в Windows переводы строк (в Windows) - PullRequest
26 голосов
/ 07 апреля 2009

Кто-нибудь знает способ (скажем, Powershell или инструмент) в Windows, который может обрабатывать каталоги и преобразовывать любые файлы Unix в файлы Windows.

Я был бы очень рад, если бы в Powershell был хотя бы обнаружен файл Unix.

Это легко сделать для одного файла, но мне нужно кое-что немного более масштабируемое (следовательно, склоняясь к решению Powershellish).

Ответы [ 10 ]

33 голосов
/ 08 апреля 2009

Вот чистый способ PowerShell, если вы заинтересованы.

Поиск файлов по крайней мере с одним окончанием строки UNIX (PowerShell v1):

dir * -inc *.txt | %{ if (gc $_.FullName -delim "`0" | Select-String "[^`r]`n") {$_} }

Вот как вы можете найти и преобразовать окончания строк UNIX в окончания строк Windows. Важно отметить, что в конец файла будет добавлено дополнительное окончание строки (\ r \ n), если в конце еще нет конца строки. Если вы действительно этого не хотите, я опубликую пример того, как вы можете этого избежать (это немного сложнее).

Get-ChildItem * -Include *.txt | ForEach-Object {
    ## If contains UNIX line endings, replace with Windows line endings
    if (Get-Content $_.FullName -Delimiter "`0" | Select-String "[^`r]`n")
    {
        $content = Get-Content $_.FullName
        $content | Set-Content $_.FullName
    }
}

Вышеприведенное работает, потому что PowerShell автоматически разбивает содержимое на \ n (удаляя \ r, если они существуют), а затем добавляет \ r \ n, когда записывает каждую вещь (в данном случае строку) в файл. Вот почему вы всегда заканчиваете строкой, заканчивающейся в конце файла.

Кроме того, я написал приведенный выше код, чтобы он изменял только те файлы, которые ему нужны. Если вас это не волнует, вы можете удалить оператор if. О, убедитесь, что только файлы попадают в ForEach-Object. Кроме этого, вы можете выполнять любую фильтрацию в начале этого конвейера.

13 голосов
/ 07 апреля 2009

В Cygwin .

есть dos2unix и unix2dos.
8 голосов
/ 19 сентября 2016

Мне кажется, это работает.

Get-Content Unix.txt | Out-File Dos.txt
6 голосов
/ 07 апреля 2009

скачать vim , открыть файл и выдать

:se fileformat=dos|up

Пакет для нескольких файлов (все * .txt файлы в C: \ tmp - рекурсивно):

:args C:\tmp\**\*.txt
:argdo se fileformat=dos|up
2 голосов
/ 07 апреля 2009

Вы можете использовать Visual Studio. Файл -> Дополнительные параметры сохранения ...

1 голос
/ 01 августа 2015

Вчера я провел 6 часов, а сегодня тестировал приведенный выше код в цикле с 10 000 файлов, многие из которых имеют размер> 50 КБ. В итоге код powershell очень неэффективен / медленен / непригоден для больших файлов и большого количества файлов. Это также не сохраняет байты спецификации. Я нашел unix2dos 7.2.3 как самое быстрое и практичное решение. Надеюсь, что это помогает другим и экономит их время.

1 голос
/ 07 апреля 2009

Если Cygwin не для вас, существует множество автономных исполняемых файлов для unix2dos под Windows, если вы используете Google, или вы можете написать его самостоятельно, см. Мой аналогичный (обратное направление для конвертации) вопрос здесь .

0 голосов
/ 13 ноября 2018

у меня работает:

 Get-ChildItem -Recurse -File | % { $tmp = Get-Content $_; $tmp | Out-File "$_" -Encoding UTF8 }
0 голосов
/ 01 октября 2018

Как насчет (только один раз):

(Get-Content -raw unix.txt) -replace "`n","`r`n" | set-content windows.txt
0 голосов
/ 06 декабря 2014

Открытие файла с окончаниями строк Unix в Wordpad и сохранение его перезапишет все окончания строк как DOS. Немного трудоемко для большого количества файлов, но время от времени работает достаточно хорошо для нескольких файлов.

...