Convert windows crlf to unix

Как преобразовать DOS или Windows перевод строки (возврата каретки и перевода строки) в Unix перевод строки (LF) в bash-скрипт?

Как я могу программно (то есть, не используя vi ) преобразовать DOS/Windows newlines в Unix?

Команды dos2unix и unix2dos недоступны в некоторых системах. Как я могу эмулировать их с помощью таких команд, как sed / awk / tr ?

Ответы — Как преобразовать DOS или Windows перевод строки (возврата каретки и перевода строки) в Unix перевод строки (LF) в bash-скрипт? / How to convert DOS/Windows newline (CRLF) to Unix newline (LF) in a Bash script?

Используя AWK вы можете сделать:

Используя Perl вы можете сделать:

Вы можете использовать tr для преобразования из DOS в Unix; однако вы можете сделать это безопасно только в том случае, если CR появляется в вашем файле только как первый байт пары байтов CRLF. Так обычно и бывает. Затем вы используете:

Обратите внимание, что имя DOS-file отличается от имени UNIX-file ; если вы попытаетесь использовать одно и то же имя дважды, вы не получите никаких данных в файле.

Вы не можете сделать это наоборот (со стандартным ‘tr’).

Если вы знаете, как ввести возврат каретки в скрипт ( control-V , control-M для ввода control-M), то:

где ‘^M ‘ — это символ control-M. Вы также можете использовать механизм bash ANSI-C Quoting для указания возврата каретки:

Однако, если вам придется делать это очень часто (грубо говоря, несколько раз), гораздо разумнее установить программы преобразования (например dos2unix и unix2dos , или, возможно dtou и utod ) и использовать их.

посмотрите здесь примеры использования sed :

Используйте sed -i для преобразования на месте, например sed -i ‘s/. /’ file .

Решения, опубликованные до сих пор, касаются только части проблемы , преобразования CRLF DOS/Windows в LF Unix; часть, которую они упускают, состоит в том, что DOS использует CRLF в качестве разделителя строк , в то время как Unix использует LF в качестве Терминатора строк . Разница в том, что файл DOS (обычно) не будет иметь ничего после последней строки в файле, в то время как Unix будет. Чтобы правильно провести конвертацию, вам необходимо добавить этот final LF (если только файл не имеет нулевой длины, т. е. в нем вообще нет строк). Мое любимое заклинание для этого (с небольшой добавленной логикой для обработки файлов, разделенных CR в стиле Mac, а не файлов, которые уже находятся в формате unix) — это немного perl:

Обратите внимание, что это отправляет Unixified версию файла в stdout. Если вы хотите заменить файл на Unixified версию, добавьте флаг perl -i .

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

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

Читайте также:  Xbox live для windows 10 ltsc

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

12 ответов

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

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

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

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

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

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

В Cygwin вы можете конвертировать между файлами Unix и DOS AKA Windows с помощью двух встроенных утилит:

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

Преобразуйте обратно в формат Unix CR:

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

Я собираюсь бросить это решение там. Гит сделает это. Смотрите это сообщение

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

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

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

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

Затем просто повторите эти 2 строки после редактирования .gitattributes

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

теперь проверьте все файлы снова

Теперь у них должно быть все, что у вас есть,

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

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

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

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

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

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

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

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

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

Онлайн-преобразователи

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

Powershell:

Читайте также:  Diskcryptor для windows 10

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

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

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

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

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

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

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

Я использовал, чтобы открыть файл в ‘edit’ и сохранить, поскольку это было выполнено .

Windows CRLF to Unix LF Issues in Vagrant

I’m working on provisioning a few VMs using Vagrant . Here’s the situation:

Host: Windows 7 (64-bit)

Guest: Ubuntu 14.04 (64-bit)

I am having an issue getting the CRLF line endings to convert to LFs. This is causing the bash scripts in the shared folder to fail within the guest machine (see below).

In my Vagrantfile I have set the shell privisioner parameter binary to false.

As per the Vagrant documentation:

binary (boolean) — Vagrant automatically replaces Windows line endings with Unix line endings. If this is true, then Vagrant will not do this. By default this is «false». If the shell provisioner is communicating over WinRM, this defaults to «true».

What’s the issue here? Am I overlooking something in the documentation?

Update 1: I have tried to edit my local Git settings as recommended in this Stack Overflow answer, but no luck. Also, I have added a .gitattributes file to the root directory of the project and added the following to that file:

I have also read over «Dealing with line endings» document provided by Git. When I commit to my repository CRLFs are converted to LFs, but when I checkout changes in a Windows workspace the LFs are converted to CRLFs. This is the exact behavior I want in my Git workflow. The issue is with Vagrant. The binary flag that I set doesn’t perform the way the documentation describes.

How to convert Windows end of line in Unix end of line (CR/LF to LF)

I’m a Java developer and I’m using Ubuntu to develop. The project was created in Windows with Eclipse and it’s using the Windows-1252 encoding.

To convert to UTF-8 I’ve used the recode program:

This command gives this error:

Convert line endings from CR/LF to a single LF: Edit the file with Vim, give the command :set ff=unix and save the file. Recode now should run without errors.

Nice, but I’ve many files to remove the CR/LF character from, and I can’t open each to do it. Vi doesn’t provide any option to command line for Bash operations.

Can sed be used to do this? How?

8 Answers 8

There should be a program called dos2unix that will fix line endings for you. If it’s not already on your Linux box, it should be available via the package manager.

sed cannot match \n because the trailing newline is removed before the line is put into the pattern space, but it can match \r , so you can convert \r\n (DOS) to \n (Unix) by removing \r:

Warning: this will change the original file

However, you cannot change from Unix EOL to DOS or old Mac ( \r ) by this. More readings here:

Actually, Vim does allow what you’re looking for. Enter Vim, and type the following commands:

Читайте также:  Astra linux подключить принтер windows

The first of these commands sets the argument list to every file matching **/*.java , which is all Java files, recursively. The second of these commands does the following to each file in the argument list, in turn:

  • Sets the line-endings to Unix style (you already know this)
  • Writes the file out iff it’s been changed
  • Proceeds to the next file

The tr command can also do this:

and should be available to you.

You’ll need to run tr from within a script, since it cannot work with file names. For example, create a file myscript.sh:

Running myscript.sh would process all the java files in the current directory and its subdirectories.

I’ll take a little exception to jichao’s answer. You can actually do everything he just talked about fairly easily. Instead of looking for a \n , just look for carriage return at the end of the line.

To change from Unix back to DOS, simply look for the last character on the line and add a form feed to it. (I’ll add -r to make this easier with grep regular expressions.)

Theoretically, the file could be changed to Mac style by adding code to the last example that also appends the next line of input to the first line until all lines have been processed. I won’t try to make that example here, though.

Warning: -i changes the actual file. If you want a backup to be made, add a string of characters after -i . This will move the existing file to a file with the same name with your characters added to the end.

How to convert DOS/Windows newline (CRLF) to Unix newline (LF) in a Bash script

How can I programmatically (i.e., not using vi ) convert DOS/Windows newlines to Unix?

The dos2unix and unix2dos commands are not available on certain systems. How can I emulate these with commands like sed , awk , and tr ?

22 Answers 22

You can use tr to convert from DOS to Unix; however, you can only do this safely if CR appears in your file only as the first byte of a CRLF byte pair. This is usually the case. You then use:

Note that the name DOS-file is different from the name UNIX-file ; if you try to use the same name twice, you will end up with no data in the file.

You can’t do it the other way round (with standard ‘tr’).

If you know how to enter carriage return into a script ( control-V , control-M to enter control-M), then:

where the ‘^M’ is the control-M character. You can also use the bash ANSI-C Quoting mechanism to specify the carriage return:

However, if you’re going to have to do this very often (more than once, roughly speaking), it is far more sensible to install the conversion programs (e.g. dos2unix and unix2dos , or perhaps dtou and utod ) and use them.

If you need to process entire directories and subdirectories, you can use zip :

This will create a zip archive with line endings changed from CRLF to CR. unzip will then put the converted files back in place (and ask you file by file — you can answer: Yes-to-all). Credits to @vmsnomad for pointing this out.

Оцените статью