Перетворити закінчення рядків 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 ... будь-який інструмент згадується в тих , може бути скасовано , щоб зробити те , що ви хочете зробити
шарлатан Кіхота


Рішення в так званих повторюваних питаннях працюють на платформах 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

Я робив щось подібне до цього, але використовував пітон.
Метью Скаутен

2
@Matthew Scouten: так ... ви знайшли утиліту unix, яка працює на windows! вітаю!
шарлатаний кіхот

8
так і ні. Я ЗАПИСУВАТИ власну утиліту. Я міг би зробити це з самого початку, але я сподівався зекономити 30 хвилин. На жаль, я не був задоволений будь-якими доступними утилітами. Найближчий я знайшов пошкоджені будь-які бінарні файли в каталозі.
Метью Скаутен

Існують проблеми з перетворенням dos2unix і unix2dos - якщо файл змішав CRLF і LF, можуть виникнути деякі випадки, які не можна буде замінити.
пібі

17

Ось простий та швидкий спосіб.

Перетягніть текстовий файл у Chrome (я не знаю про інші браузери), а потім виріжте та вставіть у початковий файл :)


2
хе-хе ... ця відповідь змусила мене
хахати

усі браузери можуть добре читати закінчення рядків Unix, включаючи IE. Але навіть тоді Wordpad також може це зробити, і так буде робити сучасний Блокнот . Тут важливо, як автоматично конвертувати декілька файлів
phuclv

10

Один, який я вважав найкращим для рекурсивного проходження папок, що дозволяє фільтрувати файли та дозволяти простий пошук "\ r \ n" та замінювати його просто "\ n", був Notepad ++ .

Блокнот ++ - одна з найкращих, безкоштовних програм із відкритим кодом із відкритим кодом для Windows. Це дуже просто і потужно. Він обробляв лінію, що закінчує пошук / заміну просто чудово. Підрядник перевіряє кучу файлів .c та .h у наш сховище із закінченнями рядків Linux \ r \ n, але оскільки більшість людей стандартизовані на інструментах побудови Windows / Eclipse, файли не збиратимуться до конвертації закінчень рядків .


8
Я думаю, ви закінчили там закінчення: linux - це \ n, windows - \ r \ n
Метью Скаутен

10
У блокноті ++ також є просте Edit -> EOL Conversionменю, якщо кількість файлів для конвертування невелика.
користувач1071136

8

Використовуйте швейцарський нож для файлів .

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

Але ця програма робить набагато більше, ніж просто це.


Я не вказую, -norecбо хочу, щоб відбулися рекурсії, але це не здається таким
Csaba Toth

6

У Cygwin ви можете конвертувати між файлами AKA Windows Unix та "DOS" за допомогою двох вбудованих утиліт:

Перетворити у формат DOS CR / LF:

u2d filename

Перетворити назад у формат CR Unix:

d2u filename

Файл залишається на тому ж імені.

Насолоджуйтесь! Рік


Іноді це називається 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 repo (папку .git), як саме вони відновлюються останньою командою git reset --hard. Це просто так, як файли видаляються, ймовірно, найкраще їх створити. вгору


1

Використовуйте текстовий редактор, який розуміє обидва закінчення рядка, як SciTE , або Блокнот ++, якщо вам не потрібно конвертувати всі закінчення рядка у всіх ваших файлах, але просто не хочеться бачити весь файл, зведений у першому рядку.


Це вони сказали, коли у мене була зворотна проблема під час переходу на Linux. Я постійно працював над інструментами, які мали проблеми з неправильними закінченнями рядків. І НІЧОГО обробляє змішані закінчення рядків розумно.
Меттью Скаутен

@Matthew Я правильно знаю закінчення рядка Unix / Windows . Я використовую його для цієї мети у windows vms, який запускаю в Linux під час редагування файлів у хост-системі.
nelaaro

Я впевнений, що редактори, які ви рекомендуєте, працюватимуть чудово. але в якийсь момент мені потрібно буде подати текстовий файл на якийсь інший інструмент, і цей інструмент НЕ буде. У той момент наявність текстового редактора, який добре поправляє речі, погіршить ситуацію, приховавши проблему. і буду обміняти, що він все ще погано поводиться зі змішаними закінченнями (або, принаймні, з примхами).
Меттью Скаутен

1
+1 для параметра "Блокнот ++" для перетворення закінчень брехні. А ось як зробити більш конкретно (див «метод 2»): staffwww.fullcoll.edu/brippe/csci123/saveAsUnix.aspx
WIP

У Notepad ++ вже є рішення для перетворення закінчень рядків, кодувань серед іншого
phuclv

0

Існує багато способів перекладу символів eoln у файли TEXT, і кожен має свій улюблений.

Але я завжди передаю файли з Linux в Windows у БІНАРИМному режимі, тоді відкриваю файли TEXT у Windows з редактором, здатним відкривати обидва типи та зберігати їх у будь-якій формі, якщо потрібно.

Для цього я використовував редактор файлів програмістів, але Блокнот ++ теж може це зробити. WordPad також корисний [принаймні, для перегляду файлів, що закінчуються LF].

Я думаю про прості текстові файли, які, можливо, виникли в Linux, і їх потрібно читати в (стандартному стандарті) світі Windows. Я не впевнений, що ви мали на увазі під "файлами, які торкнулися unix".


Проблема цього методу полягає в тому, що він робить лише один файл одночасно.
Метью Скаутен

'unix-touch файли' - це моє слово як для файлів лише LF, так і для змішаних файлів CRLF-LF. Після редагування файлу інструментами unix-oid він, як правило, «заразиться» рядками лише для LF.
Меттью Скаутен

2
Що я насправді говорив, це те, що, вибираючи правильне програмне забезпечення для перегляду текстових файлів, їх взагалі не потрібно конвертувати. До речі, я уникав прийняти вас на завдання описати файли, що закінчуються CRLF, як "належні". Це повністю залежить від вашої точки зору. Кожен метод є власним у своїй ОС. Коли файл переміщується в іншу ОС, ми виявляємо, що Win / Mac / Linux всі різні. Я підозрюю, що метод Unix / Linux є оригінальним.
pavium

3
Ви підозрюєте неправильність. Стандарт ASCII спочатку був розроблений для телевізійних машин і мав намір CRLF. Більшість інтернет-протоколів (включаючи HTTP, SMTP, FTP, IRC та багато інших) також вимагають закінчення CRLF (більшість реалізацій приймає голий LF для сумісності з невідповідними програмами Unix). У цьому випадку Windows дотримується стандарту, а Unix і Mac порушують його.
Меттью Скаут

0

Щоб запропонувати більше варіантів (навіть якщо мені найбільше сподобався хакерський відповідь user45832 ):

Інтернет-перетворювачі

Я думаю, що програма GUI FTP зробить це автоматично

Batch / 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

Отримали останні два звідси


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, не встановлюючи сторонні програми.


0

Мій дистрибутив Linux має дві маленькі утиліти, які називаються, fromdosі todosякі я використовую для цього завдання.


ОП просить інструмент Windows
phuclv

-2

Я раніше відкривав файл у "редагуванні" і зберігав, коли робота була виконана ...


що "редагувати"? у Windows 10 такого інструменту немає
phuclv


Очевидно, я використовував editу DOS, але це питання стосується Windows
phuclv

1
editраніше був частиною Windows Windows XP. Моя відповідь - приблизно 8 років. У той час він editбув частиною інсталяції Windows у багатьох випадках ...
Радек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.