Конвертировать окончания строк Unix в Windows

38

Я недавно вернулся в Windows из Linux. У меня есть некоторые файлы с CRLF, некоторые с LF, а некоторые смешанные. Есть ли утилита, которая поможет мне найти все мои файлы, затронутые Unix, и преобразовать их в правильные файлы с расширением CRLF?

Утилита должна работать на Windows, а не на Linux. Я уже переехал. Я бы предпочел не устанавливать Cygwin, если смогу избежать этого.

Мэтью Скотен
источник
1
связанные: см. superuser.com/questions/38744 superuser.com/questions/27060 superuser.com/questions/52044 ... любой инструмент, упомянутый в них, может быть изменен для достижения того, что вы хотите сделать
Quack Quixote
Двойной вопрос
укант
Решения в этих так называемых повторяющихся вопросах все работают на платформах Linux или выполняют обратное преобразование. У меня больше нет Linux. У меня есть окна.
Мэтью Скотен
1
все они доступны для Windows через Cygwin, GnuWin32, UnxUtils или тому подобное. Я полагаю, что есть сценарии Powershell, которые также могут это сделать, хотя я не знаю достаточно об этом, чтобы предоставить какие-либо ссылки.
шарлатан-кихот
1
@quack: В вопросе конкретно говорится, что пользователь ищет что-то, что будет выполнять работу в Windows, используя утилиту Windows.
Брайан Лейси

Ответы:

34

Вы можете конвертировать их с помощью unix2dosутилиты на вашей платформе Linux. Также доступны unix2dos версии для Windows .

Если у вас установлен Perl, вы также можете использовать этот вкладыш:

perl -p -e 's/\n/\r\n/' < UNIX_LF.txt > WINDOWS_CRLF.txt
Джон Т
источник
Я сделал что-то похожее на это, но я использовал Python.
Мэтью Скотен
2
@ Matthew Scouten: итак ... вы нашли утилиту Unix, которая работает на Windows! Поздравляю!
шарлатан-кихот
8
да и нет. Я написал свою проклятую утилиту. Я мог бы сделать это с самого начала, но я надеялся сэкономить 30 минут. К сожалению, я не был доволен доступными утилитами. Ближайшие найденные мной поврежденные двоичные файлы в каталоге.
Мэтью Скотен
Есть проблемы с преобразованием с dos2unix и unix2dos - если файл имеет смешанные CRLF и LF, могут быть некоторые случаи, которые не будут заменены.
pbies
17

Вот простой и быстрый способ.

Перетащите текстовый файл в Chrome (я не знаю о других браузерах), а затем вырезайте и вставляйте обратно в исходный файл :)

user45832
источник
2
хе-хе ... этот ответ заставил меня
смеяться
все браузеры могут читать окончания строк Unix просто отлично, включая IE. Но даже тогда WordPad может сделать это, как и современный Блокнот . Здесь важно, как автоматически конвертировать несколько файлов
phuclv
10

Тот, который я нашел лучше всего для рекурсивного обхода папок, разрешения файловых фильтров и простого поиска "\ r \ n" и замены его просто "\ n", был Notepad ++ .

Notepad ++ - одна из лучших бесплатных программ с открытым исходным кодом для Windows. Это очень просто и мощно. Он отлично справился с поиском / заменой окончания строки. Подрядчик проверяет кучу файлов .c и .h в нашем репозитории с окончаниями строк Linux \ r \ n, но, поскольку большинство людей стандартизировали средства сборки Windows / Eclipse, файлы не будут собираться до тех пор, пока не будут преобразованы окончания строк ,

Matt
источник
8
Я думаю, что вы изменили окончание там: Linux - это \ n, Windows - это \ r \ n
Мэтью Скотен,
10
Notepad ++ также имеет простое Edit -> EOL Conversionменю, если количество конвертируемых файлов невелико.
user1071136
8

Используйте швейцарский нож .

Например: sfk addcr -dir . -file .txt -norec
изменяет окончания LF на CR / LF для Windows во всех файлах .txt текущего каталога, но НЕ в подкаталогах (без рекурсии).

Но эта программа делает гораздо больше, чем просто это.

harrymc
источник
Я не уточняю, -norecпотому что я хочу, чтобы рекурсия произошла, но это не похоже на это
Csaba Toth
6

На Cygwin вы можете конвертировать файлы Unix и DOS AKA Windows, используя две встроенные утилиты:

Преобразовать в формат DOS CR / LF:

u2d filename

Конвертировать обратно в формат Unix CR:

d2u filename

Файл остается на месте с тем же именем.

Наслаждайтесь! стог

Рик V
источник
Это иногда называется dos2unixили unix2dosв случае, если вы не можете найти его как u2d или d2u. Также естьunix2mac
gtatr
3

Я собираюсь выбросить это решение там. Git сделает это. Смотрите этот пост об этом

Так что теоретически вы можете сделать это, чтобы преобразовать все дерево

cd root/of/tree
git init .
git add .
git commit -m "initial commit"
echo "* text eol=crlf" > .gitattributes
git rm --cached -r .
git reset --hard

Изменение crlfк , lfесли вы хотите пойти в другую сторону. ПРИМЕЧАНИЕ: вы еще не закончили, продолжайте читать

Введите, git statusчтобы увидеть, какие файлы будут затронуты. Возможно, вам придется добавить такие строки, как

*.jpg binary
*.png binary
*.gif binary

и т.д., чтобы .gitattributesизбежать конвертации определенных файлов. Вы также можете явно пометить определенные файлы как текст

*.md text
*.css text

Затем просто повторите эти 2 строки после того, как вы отредактировали .gitattributes

git rm --cached -r .
git reset --hard

Затем используйте git statusснова, чтобы увидеть, какие файлы будут изменены. Когда вы будете уверены , что все файлы , которые вы хотите пострадавших перечислены git statusзатем совершить

git add .
git commit -m "normalize line endings"

Теперь проверьте все файлы еще раз

git rm --cached -r .
git reset --hard

Теперь они должны иметь желаемое окончание строки

** ПРИМЕЧАНИЕ. Если вы уже использовали git, пропустите первые 3 команды git. Если вы не использовали git, теперь вы можете удалить .gitattributesфайл и .gitпапку.

** Создайте резервные копии ваших файлов: git rm --cached -rвсе они удаляются (хотя теоретически они находятся в вашем git-репо (папке .git), так как они восстанавливаются последней командой git reset --hard. Просто, поскольку файлы удаляются, вероятно, лучше всего их поддержать вверх.

GMan
источник
1

Используйте текстовый редактор, который понимает оба конца строк, например SciTE или Notepad ++, если вам не нужно преобразовывать все окончания строк во всех ваших файлах, но просто не хотите видеть весь файл, сгруппированный в первой строке.

nelaaro
источник
Вот что они сказали, когда у меня возникла обратная проблема при переходе на Linux. Я продолжал работать с инструментами, у которых были проблемы с неправильными окончаниями строк. И НИЧЕГО не обрабатывает смешанные окончания строк.
Мэтью Скотен
@ Mattw Я знаю, что конец строки Unix / Windows дескриптора дескриптора правильно. Я использую его для этой цели в Windows vms, которую я запускаю в Linux, при редактировании файлов в хост-системе.
nelaaro
Я уверен, что редакторы, которые вы рекомендуете, будут работать просто отлично. но в какой-то момент мне нужно будет передать текстовый файл другому инструменту, и этот инструмент НЕ будет. В этот момент наличие текстового редактора, который хорошо справляется с ситуацией, ухудшит ситуацию, скрыв проблему. и держу пари, что он по-прежнему плохо справляется со смешанными окончаниями (или, по крайней мере, со странностями).
Мэтью Скотен
1
+1 для опции notepad ++ для преобразования концов лжи. А вот как это сделать более конкретно (см. «Метод 2»): staffwww.fullcoll.edu/brippe/csci123/saveAsUnix.aspx
wip
В Notepad ++ уже есть решения для преобразования
концов
0

Есть много способов перевести символы eoln в текстовые файлы, и у каждого есть любимые.

Но я всегда передаю файлы из Linux в Windows в режиме BINARY, затем открываю файлы TEXT в Windows с помощью редактора, который может открывать оба типа и сохранять их в любой форме, если это необходимо.

Для этого я использовал Редактор файлов программистов, но Notepad ++ тоже может это сделать. WordPad также полезен [по крайней мере, для просмотра LF-файлов с завершением].

Я имею в виду простые текстовые файлы, которые могли появиться в Linux и должны быть читаемы в мире стандартов (по умолчанию). Я не уверен, что вы имели в виду под «unix-touch-файлами».

pavium
источник
Проблема этого метода в том, что он делает только один файл за раз.
Мэтью Скотен
«unix-touch-файлы» - мое слово как для LF-файлов, так и для смешанных CRLF-LF. Как только файл был отредактирован в инструментах unix-oid, он имеет тенденцию «заражаться» строками только для LF.
Мэтью Скотен
2
То, что я действительно говорил, было то, что, выбирая правильное программное обеспечение для просмотра текстовых файлов, они не должны быть преобразованы вообще. Кстати, я старался не привлекать вас к задаче для описания файлов с прекращением работы CRLF как «правильных». Это полностью зависит от вашей точки зрения. Каждый метод соответствует своей ОС. Когда файл перемещается в другую ОС, мы обнаруживаем, что Win / Mac / Linux все разные. Я подозреваю, что метод Unix / Linux является оригинальным.
павильон
3
Вы подозреваете, что это неправильно. Стандарт ASCII был первоначально разработан для телетайпов и получил мандат CRLF. Большинству интернет-протоколов (включая HTTP, SMTP, FTP, IRC и многие другие) также требуются окончания CRLF (большинство реализаций принимают голый LF для совместимости с несовместимыми программами Unix). В этом случае Windows следует стандарту, а Unix и Mac его нарушают.
Мэтью Скотен
0

Чтобы предложить больше вариантов (хотя мне больше всего понравился взломанный ответ user45832 ):

Интернет конвертеры

Я предполагаю, что программа FTP GUI сделает это автоматически

Пакетная / DOS однострочная (удаляет пустые строки) :

FOR /F "eol= delims= usebackq" %a IN (infile.txt) DO (ECHO %a>> outfile.txt)

Powershell:

gc infile.txt | %{$_.split("`n")} | Out-File outfile.txt

Получил последние два отсюда

Gregg
источник
0

Получить AWK для Windows .

Преобразовать окончания строк Unix в окончания строк Windows:

awk 'sub("$", "\r")' unixfile.txt > winfile.txt

Преобразовать окончания строк Windows в окончания строк Unix:

awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt

Более старые версии awkне включают subфункцию. В таких случаях используйте ту же команду, но замените awkна gawkили nawk.

Источник

Неем Пракс
источник
0

В Википедии есть решение в cmd:

TYPE unix_file | FIND /V "" > dos_file

В PowerShell есть различные способы сделать это, изменив то, что было сделано в этом вопросе .

(Get-Content $file -Raw).Replace("`n", "`r`n") | Set-Content $path -Force

(Get-Content $infile) -join "`r`n" > $outfile

$text = [IO.File]::ReadAllText($original_file) -replace "`n", "`r`n"
[IO.File]::WriteAllText($original_file, $text)

Это также возможно сделать в VBScript и JScript, которые также являются инструментами, уже доступными в Windows, без установки стороннего приложения.

phuclv
источник
0

Мой дистрибутив имеет две маленькие утилиты под названием fromdosи todosчто я использую для этой задачи.

фанат
источник
ОП просит инструмент
phuclv
-2

Я использовал, чтобы открыть файл в «редактировать» и сохранить как то, что работа была выполнена ...

Радек
источник
что такое "редактировать"? в Windows 10 такого инструмента нет
phuclv
очевидно, я использовал editв DOS, но этот вопрос о Windows
phuclv
1
editраньше был частью Windows до Windows XP. Мой ответ около 8 лет. В то время editбыл частью установки Windows во многих случаях ...
Radek