Konwertuj CRLF na kanały liniowe w systemie Linux

34

Jaki jest najlepszy sposób przekonwertowania CRLF na feedy liniowe w plikach w systemie Linux?

Widziałem komendy sed , ale czy jest coś prostszego?

JoelFan
źródło
4
Dupe: superuser.com/questions/38744/… . Link podany w zaakceptowanej odpowiedzi obejmuje między innymi opcje dos2unix, perl i vi.
nagul
2
To już ma lepsze odpowiedzi (więc jeśli jedna z nich ma zostać zamknięta, prawdopodobnie powinna być właśnie taka)
Jonik

Odpowiedzi:

40

Użyj tego polecenia:

fromdos yourtextfile

Odwrotnie:

todos yourtextfile

Te polecenia znajdują się w pakiecie tofrodos (w najnowszych dystrybucjach), który zapewnia także dwa opakowania unix2dos i dos2unix, które naśladują stare narzędzia uniksowe o tej samej nazwie.

avelldiroll
źródło
2
+1 Znacznie bardziej przydatne niż obecnie najczęściej wybierana odpowiedź „Użyj dos2unix”.
Jonik
1
Tak, nawet ja głosuję w tej sprawie. Mój był raczej sugestią.
Ryan C. Thompson,
Dałbym dodatkowy bonus, jeśli powiesz, jak sprawić, by był rekurencyjny. Obecnie działa tylko z symbolami wieloznacznymi.
sorin
2
@SorinSbarnea: coś w stylufind . -name '*.txt' -print0 | xargs -null fromdos
bstpierre
@Jonik, co czyni go „O wiele bardziej przydatnym”? Poważne pytanie
andrewtweber
24

Zastosowanie dos2unix.

dos2unix - konwerter formatu plików tekstowych z DOS / MAC na UNIX

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

Options:
          [-hkqV] [--help] [--keepdate] [--quiet] [--version]
Ryan C. Thompson
źródło
2
i unix2dos na odwrót.
quack quixote
Quack, śledzisz mnie? Nie dlatego, że nie doceniam tego, przy wszystkich pozytywnych opiniach.
Ryan C. Thompson,
1
koleś, jestem ~ kwak. wymówić „~” jako „not”. :) ale nie, nie podążając za tobą, wydaje mi się, że często cię spotykam.
quack quixote
1
Zastanów się, jak zdobyć to narzędzie dla swojego systemu Linux. Przynajmniej na Ubuntu nie jest domyślnie instalowany (ale instalując pakiet tofrodos otrzymujesz coś bardzo podobnego: packages.ubuntu.com/jaunty/tofrodos ).
Jonik
20

Wolę perl :

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

Ale to dobrze pasuje do moich zastosowań i bardzo łatwo mi to zapamiętać. Nie wszystkie systemy mają polecenie dos2unix, ale większość, nad którymi pracuję, ma interpreter perla.

Kolejnym jest recode , potężny zamiennik dos2unix i iconv; jest dostępny w pakiecie „recode” w repozytoriach Debiana:

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

Dla fanów awk :

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

... i sed :

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

A teraz, tylko nieco mniej skomplikowane niż ręczne usuwanie CR w edytorze szesnastkowym, prosto od jednego z naszych znajomych stackoverflow.com , używanego z interpreterem wołowiny (znajdującym się w przyjaznym sąsiedztwie repozytorium Debiana),

dos2unix in brainfuck !

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

wielkie podziękowania dla jk za marnowanie godziny życia na napisanie tego!

quack quixote
źródło
1
(bezużyteczne użycie cat i) perl jest tak skomplikowane jak sed ... dlatego tak naprawdę nie odpowiadasz na pytanie, ale raczej zyskujesz reputację :)
akira
2
„najlepszy sposób” jest subiektywny. to działa najlepiej dla mnie (jestem o wiele bardziej komfortowy z perlem niż z sedem). nie obiecałem, że to będzie dla ciebie najlepsze.
quack quixote
@akira: pytanie może zawierać wiele prawidłowych odpowiedzi. Od czasu do czasu używam tej metody, głównie w połączeniu z innymi zmianami, więc jest to zdecydowanie poprawna odpowiedź; ale „use dos2unix” jest zdecydowanie bardziej praktyczną odpowiedzią w większości sytuacji. Myślę więc, że oceny są w porządku.
reinierpost
@akira: jeśli uznasz to za prostsze, opublikuj je jako odpowiedź i oświeć resztę z nas.
quack quixote
@ ~ kwak: o to chodzi: nie jest to prostsze. to samo dotyczy twojej perlowej odpowiedzi. u2d lub fromdos / todos są poprawnymi odpowiedziami, ponieważ są prostsze niż jakiekolwiek elementy wyrażone w jakimkolwiek innym języku programowania.
akira
9

Robię to na Bash :

cat cr_stuffed.file | tr -d \r > no_more_crs.file
JustJeff
źródło
miły. widziałem dzisiaj kolejną wzmiankę o tr. to nie jest program, o którym się często wspominają, prawda?
quack quixote
7

Myślę, że możesz też użyć tr(chociaż nie mam śmiesznych plików w formacie, na których można by spróbować):

tr -d '\r' < file1 > file2
królikarnia
źródło
4

W vi lub Vim :

:%s/^V^M//g
fpmurphy
źródło
4

Znalazłem bardzo prosty sposób… Otwórz plik za pomocą nano: ## nano file.txt

naciśnij Ctrl + O, aby zapisać, ale przed naciśnięciem Enter naciśnij: Alt + D, aby przełączyć między zakończeniami linii DOS i Unix / Linux, lub: Alt + M, aby przełączyć między zakończeniami linii Mac i Unix / Linux, a następnie naciśnij Enter, aby zapisać i Ctrl + X, aby wyjść.

Stefan Sjöberg
źródło
1
Czy możesz edytować swoją odpowiedź, aby wyjaśnić, które ustawienia przełączania będą replikować zachowanie wymagane przez PO?
Burgi
OP chce więc wyłączyć zakończenia linii DOS, więc Alt+d. Czasami alt zostaje przechwycony przez program terminalowy, więc możesz użyć esc+dzamiast tego.
spinup
1
Wiele skrótów nano działa również z wciśniętym klawiszem Shift, co często zapobiega przechwytywaniu terminalu, więc też działa Alt-Shift-D.
mwfearnley
3

Wolę Vima i :set fileformat=unix. Chociaż nie jest najszybszy, daje mi podgląd. Jest to szczególnie przydatne w przypadku pliku z mieszanymi zakończeniami.

opello
źródło
1

Jeśli potrzebujesz metody GUI, wypróbuj edytor tekstu Kate (inne zaawansowane edytory tekstu również mogą to obsłużyć). Otwórz find / Wymień dialogowe ( Ctrl+ R) i wymienić \r\nz\n . (Uwaga: musisz wybrać „Wyrażenie regularne” z menu rozwijanego i odznaczyć „Tylko zaznaczenie” z opcji).

EDIT: Albo, jeśli po prostu chcesz przekonwertować do formatu Unix, a następnie wybierz opcję Menu Tools> End of Line> Unix.

DisgruntledGoat
źródło
Istnieją edytory tekstu, takie jak jEdit, które mogą wykonywać te transformacje automatycznie - po prostu powiedz, jeśli chcesz separatory linii w systemach Unix, Windows lub Mac.
Jonik
W rzeczywistości KATE może to zrobić również poprzez menu Narzędzia> Koniec linii . Może powinienem pomyśleć bardziej na boki niż odpowiadając na pytanie, dokładnie tak, jak to zostało sformułowane - ale jeśli wiesz, że specjalnie chcesz przekonwertować \r\ndo \nnastępnie przy użyciu wyszukiwania / zamiany jest łatwiejsze niż zapamiętywania który używa systemu operacyjnego, który wiersz kończący. ;)
DisgruntledGoat
1

Wklej to do skryptu Pyt2unix.py w Pythonie.

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

Powinien działać na dowolnej platformie z zainstalowanym Pythonem. Domena publiczna.

anatoly techtonik
źródło
1

CR LFdo LFkorzystania z awk :

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

Przykład użycia:

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

Wyjaśnienie:

-v RS='\r?\n'ustawi zmienną R ( wejście R ECORD s eparator) i \r?\n, wejście oznacza są odczytywane wiersz po wierszu oddzielone LF (\n ), który może ( ?) jest poprzedzony (CR \r).

1jest skrypt wykonywany przez awk. Skrypt składa się z condition { action }. W tym przypadku 1jest to warunek, który ocenia true. Akcja jest pomijana, dlatego wykonywana jest akcja domyślna, co oznacza wydrukowanie bieżącego wiersza (który można również zapisać jako{print $0} zwykłą {print}).


LFdo CR LF: można ustawić zmienną ORS( O utput R ECORD s eparator) modyfikacji końców linii wyjścia. Przykład:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C
Jaskółka oknówka
źródło
0

Użyłem tego skryptu do plików potrzebnych do awaryjnego przesłania plików z systemu Windows do systemu unix.

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

find . -type f

Znajduje wszystkie pliki rekurencyjnie w katalogu, z którego uruchomiono polecenie

xargs file

Przekaż go do programu do plików , aby uzyskać analizę pliku.

grep CRLF

Chcemy tylko danych wyjściowych pliku, który pokazuje CRLF.

cut -d: -f1

Doprowadzić wydruk do koloru. odrzuć resztę. Powinniśmy mieć teraz tylko nazwę pliku

xargs dos2unix

Przekaż nazwę pliku do programu dos2unix, używając xargs .

Tschallacka
źródło