33

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

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

11 ответов11

39

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

fromdos yourtextfile

Наоборот:

todos yourtextfile

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

24

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

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

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

Options:
          [-hkqV] [--help] [--keepdate] [--quiet] [--version]
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 за потраченный час его жизни, чтобы написать это!

9

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

cat cr_stuffed.file | tr -d \r > no_more_crs.file
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, чтобы выйти.

4

В vi или Vim:

:%s/^V^M//g
3

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

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 (Вход R ecord сек eparator) к \r?\n , что означает, что ввод читается построчно через LF (\n), который может (?) предшествовать CR (\r).

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


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

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

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

РЕДАКТИРОВАТЬ: Или, если вы просто хотите конвертировать в формат Unix, затем используйте пункт меню Tools > End of Line > Unix .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .