Конвертировать CRLF в перевод строки в Linux

27515
JoelFan

Какой лучший способ конвертировать CRLF в перевод строки в файлах в Linux?

Я видел команды sed, но есть ли что-нибудь попроще?

32
Dupe: http://superuser.com/questions/38744/how-to-convert-a-text-files-line-termination-from-windows-dos-to-unix. Ссылка, приведенная в принятом ответе, включает в себя, помимо прочего, параметры dos2unix, perl и vi. nagul 14 лет назад 4
Это уже имеет лучшие ответы (поэтому, если один из них должен быть закрыт, вероятно, это должен быть тот) Jonik 14 лет назад 2

10 ответов на вопрос

37
avelldiroll

Используйте эту команду:

fromdos yourtextfile 

Наоборот:

todos yourtextfile 

Эти команды находятся в пакете tofrodos (в большинстве последних дистрибутивов), который также предоставляет две оболочки - unix2dos и dos2unix, которые имитируют старые инструменты unix с тем же именем.

+1 Гораздо полезнее, чем самый популярный в настоящее время ответ "Use dos2unix". Jonik 14 лет назад 2
Да, даже я голосую за это. Мое было скорее предложением о проезде. Ryan Thompson 14 лет назад 1
Я бы дал дополнительный бонус, если бы вы сказали, как сделать его рекурсивным. В настоящее время работает только с подстановочными знаками. sorin 13 лет назад 0
@SorinSbarnea: что-то вроде `найти. -name '* .txt' -print0 | xargs -null fromdos` bstpierre 11 лет назад 2
@Jonik, что делает его «намного полезнее»? Серьезный вопрос andrewtweber 9 лет назад 0
Это помогло мне, другой нет. Но я действительно не помню, какой был мой вариант использования 5+ лет назад. : P Также см. [Оригинальную версию] (http://superuser.com/posts/52046/revisions) другого ответа. Jonik 9 лет назад 0
22
Ryan Thompson

Используйте dos2unix.

dos2unix - конвертер форматов текстовых файлов DOS / MAC в UNIX

dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...]  Options: [-hkqV] [--help] [--keepdate] [--quiet] [--version] 
и unix2dos для обратного. quack quixote 14 лет назад 1
Кря, ты за мной следишь? Не то, чтобы я не ценил это, со всеми возражениями. Ryan Thompson 14 лет назад 0
чувак, я кряк произносится "~" как "не". :) но нет, не следую за тобой, хотя я, кажется, сталкиваюсь с тобой часто. quack quixote 14 лет назад 1
Подумайте о том, как получить эту утилиту для вашей системы Linux. По крайней мере, в Ubuntu он не установлен по умолчанию (но, установив пакет tofrodos, вы получите нечто очень похожее: http://packages.ubuntu.com/jaunty/tofrodos). Jonik 14 лет назад 1
19
quack quixote

Я предпочитаю Perl :

perl -lne 's/\r//g; print' winfile.txt > unixfile.txt 

Но это хорошо подходит для моих целей, и мне очень легко запомнить. Не во всех системах есть команда dos2unix, но большинство, над которыми я работаю, имеют интерпретатор perl.

Другой - перекодировка, мощная замена для dos2unix и iconv; он доступен в пакете «recode» в репозиториях Debian:

recode ibmpc..lat1 winfile.txt # dos2unix recode lat1..ibmpc unixfile.txt # unix2dos 

Для поклонников awk :

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

... и sed :

sed 's/\r$//' winfile.txt > unixfile.txt 

И теперь, только чуть-чуть менее запутанно, чем удаление CR вручную в шестнадцатеричном редакторе, прямо от одного из наших друзей stackoverflow.com, который можно использовать с интерпретатором beef (находится в вашем дружественном соседнем репозитории Debian),

dos2unix в Brainfuck !

,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++. 

Большое спасибо JK за потраченный час его жизни, чтобы написать это!

(бесполезное использование cat и) perl так же сложен, как sed ... таким образом, вы на самом деле не отвечаете на вопрос, а скорее собираете репутацию :) akira 14 лет назад 1
«Лучший способ» субъективен. это работает лучше всего для меня (мне намного удобнее с perl, чем с sed). Я не обещал, что это будет работать лучше для вас. quack quixote 14 лет назад 2
@akira: вопрос может иметь несколько действительных ответов. Я также использую этот метод, иногда, в основном в сочетании с другими изменениями, так что это определенно правильный ответ; но «use dos2unix» - определенно более практичный ответ в большинстве ситуаций. Поэтому я думаю, что рейтинги в порядке. reinierpost 14 лет назад 0
@akira: если вы найдете это проще, пожалуйста, опубликуйте его как ответ и просветите всех нас. quack quixote 14 лет назад 0
@ ~ шарлатан: вот в чем дело: это не проще. это то же самое для вашего Perl ответа. u2d или fromdos / todos - правильные ответы, потому что они _простей_, чем все, что выражено на любом другом языке программирования. akira 14 лет назад 0
посмотрите на вопрос 46769, чтобы понять, что значит дать правильный И простой ответ. akira 14 лет назад 0
@ ~ шарлатан: для этого есть веб-сайт stackoverflow.com, на котором вы можете разместить вопросы. предложенный вопрос "есть ли реализация dos2unix в brainfuck?" ... не стесняйтесь задавать этот вопрос и использовать его. akira 14 лет назад 0
@akira: переполнение стека, а? где я слышал об этом раньше? quack quixote 14 лет назад 0
и теперь я испытываю желание понизить этот ответ, потому что вы постоянно повышаете запутанный уровень ... (хотя я проголосовал за "свой" вопрос на stackoverflow.com) akira 14 лет назад 0
почему нет: perl -pe 's / \ r // g' winfile.txt> unixfile.txt JoelFan 13 лет назад 0
Я нахожу это действительным, потому что «Не во всех системах есть команда dos2unix, но у большинства, над которыми я работаю, есть интерпретатор perl». demongolem 7 лет назад 0
7
JustJeff

Я делаю это на Bash :

cat cr_stuffed.file | tr -d \r > no_more_crs.file 
отлично. Я видел еще одно упоминание о TR ранее сегодня. это не программа, которая упоминается очень часто, не так ли? quack quixote 14 лет назад 0
6
warren

Я думаю, что вы также можете использовать tr(хотя у меня нет забавных файлов формата, чтобы попробовать):

tr -d '\r' < file1 > file2 
4
Stefan Sjöberg

Я нашел очень простой способ ... Открыть файл с помощью nano: ## nano file.txt

нажмите Ctrl + O для сохранения, но перед нажатием Enter нажмите: Alt + D для переключения между окончаниями строк DOS и Unix / Linux или: Alt + M для переключения между окончаниями Mac и Unix / Linux, затем нажмите Enter для сохранения и Ctrl + X, чтобы выйти.

Не могли бы вы [отредактировать] свой ответ, чтобы уточнить, какие параметры переключения будут повторять поведение, запрошенное ОП? Burgi 7 лет назад 1
ОП хочет выключить * off * окончания строки DOS, поэтому `Alt + d`. Иногда alt перехватывается терминальной программой, поэтому вы можете использовать вместо нее `esc + d`. spinup 7 лет назад 0
Множество нано-ярлыков также работают с нажатой клавишей Shift, что часто предотвращает перехват терминала, поэтому Alt-Shift-D тоже работает. mwfearnley 7 лет назад 0
3
fpmurphy1

В vi или Vim :

:%s/^V^M//g 
2
opello

Я предпочитаю Vim и :set fileformat=unix. Хотя и не самый быстрый, он дает мне предварительный просмотр. Это особенно полезно в случае файла со смешанными окончаниями.

1
DisgruntledGoat

Если вам нужен метод с графическим интерфейсом, попробуйте текстовый редактор Kate (другие продвинутые текстовые редакторы тоже могут с этим справиться). Откройте диалог поиска / замены ( Ctrl+ R) и замените \r\nна \n. (Примечание: вам нужно выбрать «Регулярное выражение» из выпадающего списка и отменить выбор «Только выбор» из опций.)

EDIT: Или, если вы просто хотите конвертировать в формат Unix, то используйте опцию меню Tools> End of Line> Unix.

Существуют текстовые редакторы, такие как jEdit, которые могут выполнять эти преобразования автоматически - вы просто скажете, хотите ли вы разделители строк Unix, Windows или Mac. Jonik 14 лет назад 0
На самом деле, KATE может сделать это тоже через меню * Tools> End of Line *. Возможно, мне следовало бы подумать более латерально, чем отвечать на вопрос точно так, как он был сформулирован, - но если вы знаете, что конкретно хотите конвертировать `\ r \ n` в` \ n`, то использовать поиск / замену проще, чем помнить, какая ОС использует какую конец строки. ;) DisgruntledGoat 14 лет назад 0
1
anatoly techtonik

Paste this into dos2unix.py Python script.

#!/usr/bin/env python """\ convert dos linefeeds (crlf) to unix (lf) usage: dos2unix.py <input> <output> """ import sys if len(sys.argv[1:]) != 2: sys.exit(__doc__) content = '' outsize = 0 with open(sys.argv[1], 'rb') as infile: content = infile.read() with open(sys.argv[2], 'wb') as output: for line in content.splitlines(): outsize += len(line) + 1 output.write(line + '\n') print("Done. Saved %s bytes." % (len(content)-outsize)) 

Should work on any platform with Python installed. Public domain.

Похожие вопросы