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

34

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

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

JoelFan
источник
4
Dupe: superuser.com/questions/38744/… . Ссылка, приведенная в принятом ответе, охватывает, помимо прочего, параметры dos2unix, perl и vi.
Нагуль
2
Это уже имеет лучшие ответы (поэтому, если один из них должен быть закрыт, вероятно, это должен быть тот)
Jonik

Ответы:

40

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

fromdos yourtextfile

Наоборот:

todos yourtextfile

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

avelldiroll
источник
2
+1 Гораздо полезнее, чем самый популярный в настоящее время ответ "Use dos2unix".
Джоник
1
Да, даже я голосую за это. Мое было скорее предложением о проезде.
Райан С. Томпсон
Я бы дал дополнительный бонус, если бы вы сказали, как сделать его рекурсивным. В настоящее время работает только с подстановочными знаками.
Сорин
2
@SorinSbarnea: что-то вродеfind . -name '*.txt' -print0 | xargs -null fromdos
bstpierre
@Jonik, что делает его "намного более полезным"? Серьезный вопрос
andrewtweber
24

Использование dos2unix.

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

dos2unix  [options] [-c convmode] [-o file ...] [-n infile outfile ...]

Options:
          [-hkqV] [--help] [--keepdate] [--quiet] [--version]
Райан К. Томпсон
источник
2
и unix2dos для обратного.
Quackote Quixote
Шарлатан, ты следишь за мной? Не то, чтобы я не ценил это, со всеми возражениями.
Райан К. Томпсон
1
чувак, я кряк произносится "~" как "не". :) но нет, не следую за тобой, хотя я, кажется, сталкиваюсь с тобой часто.
Квик-кихот
1
Подумайте о том, как получить эту утилиту для вашей системы Linux. По крайней мере, в Ubuntu он не установлен по умолчанию (но, установив пакет tofrodos, вы получите нечто очень похожее: packages.ubuntu.com/jaunty/tofrodos ).
Джоник
20

Я предпочитаю 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 за потраченный час его жизни, чтобы написать это!

шарлатан
источник
1
(бесполезное использование cat и) perl так же сложен, как sed ... таким образом, вы на самом деле не отвечаете на вопрос, а собираете репутацию :)
akira
2
«Лучший способ» субъективен. это работает лучше всего для меня (мне намного удобнее с perl, чем с sed). Я не обещал, что это будет работать лучше для вас.
Квик-кихот
@akira: вопрос может иметь несколько действительных ответов. Я также использую этот метод, иногда, в основном в сочетании с другими изменениями, так что это, безусловно, правильный ответ; но «use dos2unix» - определенно более практичный ответ в большинстве ситуаций. Поэтому я думаю, что рейтинги в порядке.
reinierpost
@akira: если вы найдете это проще, пожалуйста, опубликуйте его как ответ и просветите всех нас.
Квик-кихот
@ ~ шарлатан: вот в чем дело: это не проще. это то же самое для вашего Perl ответа. u2d или fromdos / todos - правильные ответы, потому что они проще, чем любые вещи, выраженные на любом другом языке программирования.
Акира
9

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

cat cr_stuffed.file | tr -d \r > no_more_crs.file
JustJeff
источник
хороший. Я видел еще одно упоминание о TR ранее сегодня. это не программа, которая упоминается очень часто, не так ли?
шарлатан-кихот
7

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

tr -d '\r' < file1 > file2
кроличий садок
источник
4

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

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

Стефан Шёберг
источник
1
Не могли бы вы отредактировать свой ответ, чтобы уточнить, какие параметры переключения будут повторять поведение, запрошенное OP?
Бурги
ОП хочет отключить окончания строки DOS, поэтому Alt+d. Иногда alt перехватывается терминальной программой, поэтому вы можете использовать esc+dвместо этого.
раскрутка
1
Множество нано-ярлыков также работают с нажатой клавишей Shift, что часто предотвращает перехват терминала, поэтому Alt-Shift-D тоже работает.
mwfearnley
3

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

opello
источник
1

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

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

DisgruntledGoat
источник
Существуют текстовые редакторы, такие как jEdit, которые могут выполнять эти преобразования автоматически - вы просто скажете, хотите ли вы разделители строк Unix, Windows или Mac.
Джоник
На самом деле, KATE может сделать это тоже через меню Инструменты> Конец строки . Может быть , я должен подумать более латерально , чем ответить на этот вопрос точно так , как он был сформулирован , - но если вы знаете , что вы конкретно хотите преобразовать \r\nв \nто с помощью поиска / замены проще , чем припоминания , которая использует ОС , какая линия заканчивающегося. ;)
DisgruntledGoat
1

Вставьте это в скрипт Python dos2unix.py .

#!/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))

Должен работать на любой платформе с установленным Python. Всеобщее достояние.

анатолий техтоник
источник
1

CR LFс LFиспользованием AWK :

awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename

Пример использования:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C

Объяснение:

-v RS='\r?\n'устанавливает переменную RS ( input r ecord s eparator) в \r?\nзначение, означающее, что input читается строка за строкой, разделенная LF ( \n), которой может ( ?) предшествовать CR ( \r).

1скрипт, исполняемый awk Сценарий состоит из condition { action }. В этом случае 1это условие, которое оценивается как истинное. Действие опущено, поэтому выполняется действие по умолчанию, что означает печать текущей строки (которая также может быть записана как {print $0}или просто {print}).


LFв CR LF: Вы можете установить переменную ORS( о utput г ecord s eparator) , чтобы изменить концы линии выхода. Пример:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C
Мартин
источник
0

Я использовал этот скрипт для файлов, необходимых для экстренной передачи файлов из системы Windows в систему Unix.

 find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix

find . -type f

Находит все файлы, рекурсивно в каталоге, из которого вы запускаете команду

xargs file

Передайте его в файловую программу, чтобы получить анализ файла.

grep CRLF

Мы хотим только вывод файла, который показывает CRLF.

cut -d: -f1

Получите выход до цвета. откажитесь от всего остального. У нас должно быть только имя файла

xargs dos2unix

Передайте имя файла программе dos2unix, используя xargs .

Tschallacka
источник