Новые строки Unix для новых строк Windows (в Windows)
Кто-нибудь знает способ (скажем, Powershell или инструмент) в Windows, который может переписывать через каталог и конвертировать любые файлы unix в файлы Windows.
Я был бы очень доволен тем, как Powershell мог обнаружить файл unix.
Легко сделать это для одного файла, но я за чем-то более масштабируемым (следовательно, склоняюсь к решению Powershellish).
Ответы
Ответ 1
Вот вам чистый способ 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. Помимо этого вы можете сделать любую фильтрацию, которую вы хотите в начале этого конвейера.
Ответ 2
Есть dos2unix и unix2dos в Cygwin.
Ответ 3
Кажется, это работает для меня.
Get-Content Unix.txt | Out-File Dos.txt
Ответ 4
скачать vim, откройте файл и выпустите
:se fileformat=dos|up
Пакет для нескольких файлов (все *.txt файлы в C:\tmp - рекурсивные):
:args C:\tmp\**\*.txt
:argdo se fileformat=dos|up
Ответ 5
Вы можете использовать Visual Studio. Файл → Расширенные параметры сохранения...
Ответ 6
Если Cygwin не для вас, существует множество автономных исполняемых файлов для unix2dos под Windows, если вы используете Google, или можете написать его сами, см. мой вопрос (обратное направление для преобразования) .
Ответ 7
Я провел 6 часов вчера и сегодня тестировал код, приведенный выше, в цикле с 10 000 файлами, многие из которых размером > 50 КБ. Внизу, код powershell очень неэффективен/медленный/непригодный для больших файлов и большого количества файлов. Он также не сохраняет байты спецификации. Я нашел unix2dos 7.2.3 самым быстрым и практичным решением. Надейтесь, что это помогает другим и экономит время.
Ответ 8
Открытие файла с окончанием строки Unix в Wordpad и сохранение его приведет к переписыванию всех окончаний строки в виде DOS. Немного трудоемкий для большого количества файлов, но он работает достаточно хорошо для нескольких файлов раз в то время.
Ответ 9
visual studio - расширенные варианты сохранения - это лучший (простой и эффективный) вариант, специально предназначенный для работы с большими файлами. Notepad ++ cant обрабатывает файлы порядка 50 МБ
Ответ 10
Как насчет этого (с отрицательным "взглядом позади"). Без -nonewline set-content помещает дополнительный 'r' n внизу. С помощью скобок вы можете изменить тот же файл. Это должно быть безопасно при случайном выполнении одного и того же файла.
function unix2dos ($infile, $outfile) {
(Get-Content -raw $infile) -replace "(?<!'r)'n","'r'n" |
set-content -nonewline $outfile
}
Обратное было бы, окна для Unix текста.
function dos2unix ($infile, $outfile) {
(Get-Content -raw $infile) -replace "'r'n","'n" |
set-content -nonewline $outfile
}
Примеры (входной и выходной файлы могут быть одинаковыми):
dos2unix dos.txt unix.txt
unix2dos unix.txt dos.txt
unix2dos file.txt file.txt
Если у вас есть emacs, вы можете проверить его с помощью esc-x hexl-mode. Блокнот не будет правильно отображать текст Unix; все будет на одной линии. Я должен указать путь для set-content, потому что -replace стирает свойство pspath.
Ответ 11
Меня устраивает:
Get-ChildItem -Recurse -File | % { $tmp = Get-Content $_; $tmp | Out-File "$_" -Encoding UTF8 }