Перетворення CRLF в рядкові канали на Linux


34

Який найкращий спосіб перетворити CRLF в рядкові канали у файли на Linux?

Я бачив команди sed , але чи є щось простіше?


4
Dupe: superuser.com/questions/38744/… . Посилання, що надається у прийнятій відповіді, охоплює варіанти dos2unix, perl та vi серед інших.
nagul

2
На це вже є кращі відповіді (тож якщо один із них буде закритий, він, мабуть, повинен бути таким)
Jonik

Відповіді:


40

Використовуйте цю команду:

fromdos yourtextfile

Навпаки:

todos yourtextfile

Ці команди знаходяться в tofrodos пакеті (на більшості сучасних дистрибутивів), який також надає два пакувальники Unix2Dos і dos2unix , які імітують старі інструменти UNIX одного і того ж імені.


2
+1 Набагато корисніше, ніж відповідь на даний момент "Використовуйте dos2unix".
Джонік

1
Так, навіть я голосую за це. Шахта була більшою мірою навіювальною пропозицією.
Райан Ч. Томпсон

Я б дав додатковий бонус, якщо ви скажете, як зробити його рекурсивним. В даний час працює лише з макетками.
sorin

2
@SorinSbarnea: щось на кшталтfind . -name '*.txt' -print0 | xargs -null fromdos
bstpierre

@Jonik, що робить його "набагато кориснішим"? Серйозне запитання
andrewtweber

24

Використовуйте dos2unix.

dos2unix - перетворювач формату текстових файлів UNOS / MAC в UNIX

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

Options:
          [-hkqV] [--help] [--keepdate] [--quiet] [--version]

2
і unix2dos в інший бік.
шарлатаний кіхот

Кваке, ти йдеш за мною? Не те, що я не ціную це з усіма відгуками.
Райан К. Томпсон,

1
чувак, я ~ хрип. вимовляти "~" як "не". :) але ні, не слідуючи за вами, тому я, здається, часто нападаю на вас.
шарлатаний кіхот

1
Розглянемо докладніше, як отримати цю утиліту для вашої системи Linux. Принаймні , на Ubuntu він не встановлений за замовчуванням (але при установці tofrodos пакет ви отримаєте що - то дуже схоже: packages.ubuntu.com/jaunty/tofrodos ).
Jonik

20

Я віддаю перевагу perl :

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

Але це добре підходить для моїх потреб, і мені це дуже легко запам'ятати. Не всі системи мають команду dos2unix, але більшість, над якими я працюю, мають інтерпретатор perl.

Інший - recode , потужна заміна dos2unix та iconv; він доступний у пакеті «перекодувати» у сховищах 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 , використовуваного з інтерпретатором яловичини (розташованим у вашому дружньому сховищі Debian сховища),

dos2unix in brainfuck !

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

велике спасибі jk, що витратили годину свого життя, щоб написати це!


1
(марне використання котів і) perl настільки ж складно, як і sed ... таким чином, ви насправді не відповідаєте на питання, а скоріше збираєте репутацію :)
akira

2
"найкращий спосіб" є суб'єктивним. це найкраще працює для мене (мені більше комфортно perl, ніж sed). Я не обіцяв, що це буде найкраще працювати для вас.
шарлатаний кіхот

@akira: запитання може мати кілька дійсних відповідей. Я також використовую цей метод час від часу, в основному в поєднанні з іншими змінами, тому це, безумовно, правильна відповідь; але "використовувати dos2unix", безумовно, більш практична відповідь у більшості ситуацій. Тому я думаю, що рейтинги - це добре.
reinierpost

@akira: якщо вам здається, що це простіше, будь ласка, опублікуйте це як відповідь і просвітіть решту нас.
шарлатанний кіхот

@ ~ quack: в цьому справа: це не простіше. те саме для вашої відповіді на перл. u2d або fromdos / todos - правильні відповіді, оскільки вони простіші за будь-які речі, виражені в будь-якій іншій мові програмування.
akira

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, щоб вийти.


1
Чи можете ви відредагувати свою відповідь, щоб уточнити, які параметри перемикання будуть повторювати поведінку, яку вимагає ОП?
Бургі

ОП хоче вимкнути закінчення рядків DOS Alt+d. Іноді програма alt перехоплюється термінальною програмою, тому ви можете використовувати її esc+dзамість.
спінуп

1
Багато нано-ярликів також працюють із натиснутою клавішею Shift, що часто запобігає перехопленню терміналу, тому "Alt-Shift-D" працює також.
mwfearnley

3

Я віддаю перевагу Віму і :set fileformat=unix. Хоча це і не найшвидший, але він дає мені попередній перегляд. Це особливо корисно у випадку з файлом зі змішаними закінченнями.


1

Якщо вам потрібен метод GUI, спробуйте редактор тексту Kate (інші вдосконалені текстові редактори можуть також впоратися з цим). Відкрийте діалогове вікно пошуку / заміни ( Ctrl+ R) та замініть \r\nна \n. (Примітка: вам потрібно буде вибрати "Регулярний вираз" зі спадного меню та зніміть з опцій "Тільки для вибору".)

EDIT: Чи, якщо ви просто хочете конвертувати в формат Unix, то використовуйте опцію меню Tools> End of Line> Unix.


Є текстові редактори, такі як jEdit, які можуть робити ці перетворення автоматично - ви просто скажете це, якщо ви хочете розділити рядки для Unix, Windows або Mac.
Джонік

Власне, KATE може це зробити і через меню Інструменти> Кінець рядка . Можливо, я міг би подумати більше, ніж відповісти на питання саме так, як це було сформульовано - але якщо ви знаєте, що ви конкретно хочете перейти \r\nдо \nцього, то за допомогою пошуку / заміни простіше, ніж запам’ятовувати, яка ОС використовує, який рядок закінчується. ;)
НезадоволенняGoat

1

Вставте це в скрипт dos2unix.py Python.

#!/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 s eparator) на \r?\n, тобто вхід читається рядок за рядком, розділеним LF ( \n), якому може ( ?) передувати CR ( \r).

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


LFдо CR LF: Ви можете встановити змінну ORS( o utput r 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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.