Ogólnie rzecz biorąc, po prostu zainstaluj dos2unixza pomocą menedżera pakietów, to naprawdę jest znacznie prostsze i istnieje na większości platform.
Brad Koch
1
Zgoda! @BradKoch Proste jak „brew install dos2unix” na Mac OSX
SmileIT
Odpowiedzi:
322
Możesz użyć trdo konwersji z DOS-a na Uniksa; można to jednak zrobić bezpiecznie tylko wtedy, gdy CR pojawia się w pliku tylko jako pierwszy bajt pary bajtów CRLF. Zazwyczaj tak jest. Następnie używasz:
tr -d '\015'<DOS-file >UNIX-file
Zauważ, że nazwa DOS-filejest inna niż nazwa UNIX-file; jeśli spróbujesz użyć tej samej nazwy dwa razy, skończysz bez danych w pliku.
Nie możesz tego zrobić na odwrót (ze standardowym „tr”).
Jeśli wiesz, jak wprowadzić znak powrotu karetki do skryptu ( control-V, control-Maby wpisać control-M), to:
sed 's/^M$//'# DOS to Unix
sed 's/$/^M/'# Unix to DOS
gdzie „^ M” jest znakiem kontrolnym M. Możesz także użyć mechanizmu bashcytowania ANSI-C , aby określić zwrot karetki:
sed $'s/\r$//'# DOS to Unix
sed $'s/$/\r/'# Unix to DOS
Jeśli jednak będziesz musiał to robić bardzo często (mniej więcej raz, z grubsza mówiąc), rozsądniej jest zainstalować programy do konwersji (np. dos2unixI unix2dos, a może dtoui utod) i używać ich.
Jeśli chcesz przetwarzać całe katalogi i podkatalogi, możesz użyć zip:
zip -r -ll zipfile.zip somedir/
unzip zipfile.zip
Spowoduje to utworzenie archiwum zip ze zmienionymi zakończeniami linii z CRLF na CR. unzipnastępnie umieści przekonwertowane pliki z powrotem na swoim miejscu (i poprosi o plik po pliku - możesz odpowiedzieć: Tak-dla-wszystkich). Podziękowania dla @vmsnomad za zwrócenie na to uwagi.
użycie tr -d '\015' <DOS-file >UNIX-filewhere DOS-file== UNIX-filepowoduje po prostu pusty plik. Plik wyjściowy musi niestety być innym plikiem.
Buttle Butkus
3
@ButtleButkus: Cóż, tak; dlatego użyłem dwóch różnych nazw. Jeśli zapełnisz plik wejściowy, zanim program przeczyta wszystko, podobnie jak w przypadku dwukrotnego użycia tej samej nazwy, otrzymujesz pusty plik. To jest jednolite zachowanie w systemach uniksopodobnych. Wymaga specjalnego kodu do bezpiecznego nadpisywania pliku wejściowego. Postępuj zgodnie z instrukcjami, a wszystko będzie dobrze.
Jonathan Leffler,
Wydaje mi się, że pamiętam jakąś funkcję wyszukiwania w zamianie w pliku.
Buttle Butkus
4
Są miejsca; musisz wiedzieć, gdzie je znaleźć. W granicach limitów działa sedopcja GNU -i(na miejscu); limitami są połączone pliki i dowiązania symboliczne. sortPolecenie ma „zawsze” (od 1979 roku, jeśli nie wcześniej) poparła -oopcję, która potrafi wymienić jeden z plików wejściowych. Jest to jednak częściowo spowodowane tym, że sortmusi odczytać wszystkie dane wejściowe, zanim będzie mógł zapisać dowolne dane wyjściowe. Inne programy sporadycznie obsługują zastępowanie jednego ze swoich plików wejściowych. Możesz znaleźć program ogólnego zastosowania (skrypt), aby uniknąć problemów w 'The Programming Environment UNIX' autorstwa Kernighan & Pike.
Jonathan Leffler,
3
Trzecia opcja zadziałała dla mnie, dzięki. Użyłem opcji -i: sed -i $'s/\r$//' filename- do edycji w miejscu. Pracuję na maszynie, która nie ma dostępu do Internetu, więc problem stanowi instalacja oprogramowania.
# IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.
sed 's/.$//'# assumes that all lines end with CR/LF
sed 's/^M$//'# in bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/\x0D$//'# works on ssed, gsed 3.02.80 or higher# IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format.
sed "s/$/`echo -e \\\r`/"# command line under ksh
sed 's/$'"/`echo \\\r`/"# command line under bash
sed "s/$/`echo \\\r`/"# command line under zsh
sed 's/$/\r/'# gsed 3.02.80 or higher
Użyj sed -ido konwersji w miejscu, np sed -i 's/..../' file.
Użyłem wariantu, ponieważ mój plik zawierał tylko \r:tr "\r" "\n" < infile > outfile
Matt Todd,
1
@MattTodd czy możesz to opublikować jako odpowiedź? -djest opisywany częściej i nie pomoże w „tylko \r” sytuacji.
n611x007
5
Należy zauważyć, że proponowane \rdo \nmapowania daje efekt podwójnych odstępów plików; każda pojedyncza linia CRLF kończąca się na DOS staje się \n\nUnix.
Jonathan Leffler
Czy mogę to zrobić rekurencyjnie?
Aaron Franke
36
Robienie tego z POSIX jest trudne:
POSIX Sed nie obsługuje \rlub \15. Nawet jeśli tak, opcja na miejscu -inie jest POSIX
POSIX awk robi wsparcie \ri \15, jednak -i inplaceopcja ta nie jest POSIX
Wygląda na to, że obsługuje POSIX . tr\r Więc możesz również użyć printf '%s\n' '%!tr -d "\r"' x | ex file(choć przyznane, to usunięte, \rnawet jeśli nie bezpośrednio poprzedzające \n). Ponadto -bopcja exnie jest określona przez POSIX.
Wildcard
1
Robienie tego w POSIX jest łatwe. Osadź literał CR w skrypcie, wpisując go (to control-M).
Joshua
28
Możesz używać vima programowo z opcją -c {polecenie}:
Dos dla Uniksa:
vim file.txt -c "set ff=unix"-c ":wq"
Uniks do dos:
vim file.txt -c "set ff=dos"-c ":wq"
„set ff = unix / dos” oznacza zmianę formatu pliku (ff) pliku na format końca wiersza Unix / DOS
„: wq” oznacza zapisanie pliku na dysk i zamknięcie edytora (pozwalając na użycie polecenia w pętli)
Wiem, że pytanie dotyczy alternatyw dla dos2unix, ale jest to pierwszy wynik Google.
Boris
18
Ten problem można rozwiązać za pomocą standardowych narzędzi, ale istnieje wystarczająco wiele pułapek dla nieostrożnych, że zalecam zainstalowanie flippolecenia, które zostało napisane ponad 20 lat temu przez autora Rahula Dhesi zoo. Doskonale radzi sobie z konwersją formatów plików, na przykład unikając przypadkowego zniszczenia plików binarnych, co jest nieco zbyt łatwe, jeśli po prostu ścigasz się zmieniając każdy CRLF, który widzisz ...
Miałem doświadczenie z łamaniem połowy mojego systemu operacyjnego poprzez uruchomienie texxto z niewłaściwą flagą. Zachowaj ostrożność, zwłaszcza jeśli chcesz to zrobić dla całych folderów.
A_P
14
Dotychczasowe rozwiązania dotyczą tylko części problemu, przekształcając CRLF DOS / Windows w LF Unixa; brakuje im tylko tego, że DOS używa CRLF jako separatora linii , podczas gdy Unix używa LF jako terminatora linii . Różnica polega na tym, że plik DOS (zwykle) nie będzie miał nic po ostatniej linii pliku, podczas gdy Unix będzie. Aby poprawnie wykonać konwersję, musisz dodać ten końcowy LF (chyba że plik ma zerową długość, tj. Nie ma w nim żadnych linii). Moje ulubione zaklęcie do tego (z nieco dodaną logiką do obsługi plików rozdzielonych CR w stylu Mac, a nie molestujących plików, które są już w formacie unixowym) to trochę perl:
@LudovicZenohateLagouardette Czy był to zwykły plik tekstowy (tj. Plik CSV lub tekst z rozróżnieniem tabulatorów), czy coś innego? Jeśli był w jakimś formacie bazodanowym, manipulowanie nim tak, jakby to był tekst, może uszkodzić jego wewnętrzną strukturę.
Gordon Davisson
Zwykły tekst csv, ale myślę, że szyfrowanie było dziwne. Myślę, że to popsuło z tego powodu. Jednak nie martw się. Zawsze zbieram kopie zapasowe, a to nie był nawet prawdziwy zestaw danych, tylko 1 GB. Rzeczywista to 26 GB.
Ludovic Zenohate Lagouardette
14
Jeśli nie masz dostępu do dos2unix , ale możesz przeczytać tę stronę, możesz skopiować / wkleić dos2unix.py z tego miejsca.
#!/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))
Zastosowanie jest mylące. Rzeczywiste domyślnie dos2unixkonwertuje wszystkie pliki wejściowe. Twoje użycie oznacza -nparametr. A prawdziwy dos2unixto filtr, który odczytuje ze standardowego wejścia, zapisuje na standardowe wyjście, jeśli pliki nie są podane.
Dziękuję Ci! To działa, chociaż piszę nazwę pliku i nie --. Wybrałem to rozwiązanie, ponieważ jest dla mnie łatwe do zrozumienia i dostosowania. Do Twojej dyspozycji są przełączniki: -pzałóż pętlę „while input”, -iedytuj plik wejściowy na miejscu, -ewykonaj następujące polecenie
Rolf
Ściśle mówiąc, PCRE to reimplementacja silnika wyrażeń regularnych Perla, a nie silnika wyrażeń regularnych Perla. Obaj mają taką możliwość, chociaż istnieją także różnice, pomimo implikacji w nazwie.
tripleee
6
Jeszcze prostsze rozwiązanie awk bez programu:
awk -v ORS='\r\n''1' unix.txt > dos.txt
Technicznie „1” to twój program, b / c awk wymaga jednego, gdy podano opcję.
AKTUALIZACJA : Po ponownym odwiedzeniu tej strony od dłuższego czasu zdałem sobie sprawę, że nikt jeszcze nie opublikował wewnętrznego rozwiązania, więc oto jedno:
while IFS= read -r line;do printf '%s\n'"${line%$'\r'}";done< dos.txt > unix.txt
Jest to przydatne, ale dla jasności: tłumaczy to Unix -> Windows / DOS, co jest odwrotnym kierunkiem do tego, o co poprosił OP.
mklement0
5
Zostało to zrobione celowo, pozostawione jako ćwiczenie dla autora. eyerollsawk -v RS='\r\n' '1' dos.txt > unix.txt
nawK
Świetne (i wyrazy uznania dla was za pedagogiczną finezję).
mklement0
1
„b / c awk wymaga jednego, gdy podano opcję.” - awk zawsze wymaga programu, niezależnie od tego, czy podano opcje, czy nie.
mklement0
1
Rozwiązanie czysto bashowe jest interesujące, ale znacznie wolniejsze niż jego odpowiednik awklub sedrozwiązanie. Musisz także użyć, while IFS= read -r lineaby wiernie zachować linie wejściowe, w przeciwnym razie początkowe i końcowe białe znaki zostaną przycięte (alternatywnie, nie używaj nazwy zmiennej w readpoleceniu i pracuj z $REPLY).
mklement0
5
Musiałem tylko zastanowić się nad tym samym pytaniem (po stronie Windows, ale równie dobrze dotyczy Linuksa). Zaskakująco nikt nie wspomniał o bardzo zautomatyzowanym sposobie wykonywania konwersji CRLF <-> LF dla plików tekstowych przy użyciu starej dobrej zip -llopcji (Info-ZIP):
zip -ll textfiles-lf.zip files-with-crlf-eol.*
unzip textfiles-lf.zip
UWAGA: spowoduje to utworzenie pliku zip z zachowaniem oryginalnych nazw plików, ale konwersją zakończeń linii do LF. Następnieunzip rozpakowałbym pliki jako skompresowane, czyli z ich oryginalnymi nazwami (ale z końcówkami LF), prosząc w ten sposób o zastąpienie lokalnych oryginalnych plików, jeśli takie istnieją.
Odpowiedni fragment z zip --help :
zip --help
...-l convert LF to CR LF (-ll CR LF to LF)
Będzie to przekształcić każdą pojedynczą DOS-przełamane na dwie UNIX nowej linii.
Melebius
2
W przypadku systemu Mac OSX, jeśli masz zainstalowany program Homebrew [ http://brew.sh/][1]
brew install dos2unix
for csv in*.csv;do dos2unix -c mac ${csv};done;
Upewnij się, że wykonałeś kopie plików, ponieważ to polecenie zmodyfikuje pliki na miejscu. Opcja -c mac sprawia, że przełącznik jest zgodny z systemem osx.
Ta odpowiedź tak naprawdę nie jest pytaniem oryginalnego plakatu.
hlin117
2
Użytkownicy systemu OS X nie powinni używać -c mac, czyli do konwertowania CRtylko nowych linii przed systemem OS X. Chcesz używać tego trybu tylko do plików do i z Mac OS 9 lub wcześniejszych.
askewchan
2
TIMTOWTDI!
perl -pe 's/\r\n/\n/; s/([^\n])\z/$1\n/ if eof'PCfile.txt
Możesz użyć awk. Ustaw separator rekordów ( RS) na wyrażenie regularne, które pasuje do wszystkich możliwych znaków nowej linii lub znaków. I ustaw separator rekordów wyjściowych ( ORS) na znak nowej linii w stylu uniksowym.
Ponieważ w pytaniu mowa jest o sed, jest to najprostszy sposób użycia sed, aby to osiągnąć. To, co mówi to wyrażenie, zastępuje wszystkie znaki powrotu karetki i znak wiersza tylko wierszami. Właśnie tego potrzebujesz, kiedy przechodzisz z Windowsa na Unixa. Sprawdziłem, czy to działa.
Hej, John Paul - ta odpowiedź została oznaczona do usunięcia, więc pojawiła się w kolejce do mnie. Zasadniczo, gdy masz takie pytanie, które ma 8 lat i 22 odpowiedzi, powinieneś wyjaśnić, w jaki sposób twoja odpowiedź jest przydatna w sposób, w jaki inne istniejące odpowiedzi nie są.
zzxyz
0
Jako rozszerzenie rozwiązania Jonathan Leffler Unix na DOS, aby bezpiecznie przekonwertować na DOS, gdy nie masz pewności co do bieżących zakończeń linii pliku:
sed '/^M$/! s/$/^M/'
To sprawdza, czy linia nie kończy się na CRLF przed konwersją do CRLF.
Stworzyłem skrypt w oparciu o zaakceptowaną odpowiedź, więc możesz go przekonwertować bezpośrednio, bez potrzeby dodatkowego pliku na końcu, a następnie usunąć i zmienić jego nazwę.
tylko upewnij się, że jeśli masz plik taki jak „plik1.txt”, że „plik1.txt2” jeszcze nie istnieje lub zostanie zastąpiony, używam go jako tymczasowego miejsca do przechowywania pliku.
dos2unix
za pomocą menedżera pakietów, to naprawdę jest znacznie prostsze i istnieje na większości platform.Odpowiedzi:
Możesz użyć
tr
do konwersji z DOS-a na Uniksa; można to jednak zrobić bezpiecznie tylko wtedy, gdy CR pojawia się w pliku tylko jako pierwszy bajt pary bajtów CRLF. Zazwyczaj tak jest. Następnie używasz:Zauważ, że nazwa
DOS-file
jest inna niż nazwaUNIX-file
; jeśli spróbujesz użyć tej samej nazwy dwa razy, skończysz bez danych w pliku.Nie możesz tego zrobić na odwrót (ze standardowym „tr”).
Jeśli wiesz, jak wprowadzić znak powrotu karetki do skryptu ( control-V, control-Maby wpisać control-M), to:
gdzie „^ M” jest znakiem kontrolnym M. Możesz także użyć mechanizmu
bash
cytowania ANSI-C , aby określić zwrot karetki:Jeśli jednak będziesz musiał to robić bardzo często (mniej więcej raz, z grubsza mówiąc), rozsądniej jest zainstalować programy do konwersji (np.
dos2unix
Iunix2dos
, a możedtou
iutod
) i używać ich.Jeśli chcesz przetwarzać całe katalogi i podkatalogi, możesz użyć
zip
:Spowoduje to utworzenie archiwum zip ze zmienionymi zakończeniami linii z CRLF na CR.
unzip
następnie umieści przekonwertowane pliki z powrotem na swoim miejscu (i poprosi o plik po pliku - możesz odpowiedzieć: Tak-dla-wszystkich). Podziękowania dla @vmsnomad za zwrócenie na to uwagi.źródło
tr -d '\015' <DOS-file >UNIX-file
whereDOS-file
==UNIX-file
powoduje po prostu pusty plik. Plik wyjściowy musi niestety być innym plikiem.sed
opcja GNU-i
(na miejscu); limitami są połączone pliki i dowiązania symboliczne.sort
Polecenie ma „zawsze” (od 1979 roku, jeśli nie wcześniej) poparła-o
opcję, która potrafi wymienić jeden z plików wejściowych. Jest to jednak częściowo spowodowane tym, żesort
musi odczytać wszystkie dane wejściowe, zanim będzie mógł zapisać dowolne dane wyjściowe. Inne programy sporadycznie obsługują zastępowanie jednego ze swoich plików wejściowych. Możesz znaleźć program ogólnego zastosowania (skrypt), aby uniknąć problemów w 'The Programming Environment UNIX' autorstwa Kernighan & Pike.sed -i $'s/\r$//' filename
- do edycji w miejscu. Pracuję na maszynie, która nie ma dostępu do Internetu, więc problem stanowi instalacja oprogramowania.spójrz tutaj na przykłady, używając
sed
:Użyj
sed -i
do konwersji w miejscu, npsed -i 's/..../' file
.źródło
\r
:tr "\r" "\n" < infile > outfile
-d
jest opisywany częściej i nie pomoże w „tylko\r
” sytuacji.\r
do\n
mapowania daje efekt podwójnych odstępów plików; każda pojedyncza linia CRLF kończąca się na DOS staje się\n\n
Unix.Robienie tego z POSIX jest trudne:
POSIX Sed nie obsługuje
\r
lub\15
. Nawet jeśli tak, opcja na miejscu-i
nie jest POSIXPOSIX awk robi wsparcie
\r
i\15
, jednak-i inplace
opcja ta nie jest POSIXd2u i dos2unix nie są narzędziami POSIX , ale ex jest
POSIX ex nie obsługuje
\r
,\15
,\n
lub\12
Aby usunąć zwroty karetki:
Aby dodać zwrot karetki:
źródło
tr
\r
Więc możesz również użyćprintf '%s\n' '%!tr -d "\r"' x | ex file
(choć przyznane, to usunięte,\r
nawet jeśli nie bezpośrednio poprzedzające\n
). Ponadto-b
opcjaex
nie jest określona przez POSIX.Możesz używać vima programowo z opcją -c {polecenie}:
Dos dla Uniksa:
Uniks do dos:
„set ff = unix / dos” oznacza zmianę formatu pliku (ff) pliku na format końca wiersza Unix / DOS
„: wq” oznacza zapisanie pliku na dysk i zamknięcie edytora (pozwalając na użycie polecenia w pętli)
źródło
vi
będzie wiedział, co:wq
znaczy. Dla tych, którzy nie mają 3 znaków, 1) otwórz obszar poleceń vi, 2) napisz i 3) wyjdź.Korzystając z AWK możesz:
Używając Perla możesz:
źródło
awk
rozwiązanie.Aby przekonwertować plik na miejscu, użyj
Aby wyprowadzić przekonwertowany tekst na inny plik, użyj
Możesz zainstalować go na Ubuntu lub Debianie za pomocą
lub w systemie macOS za pomocą homebrew
źródło
Ten problem można rozwiązać za pomocą standardowych narzędzi, ale istnieje wystarczająco wiele pułapek dla nieostrożnych, że zalecam zainstalowanie
flip
polecenia, które zostało napisane ponad 20 lat temu przez autora Rahula Dhesizoo
. Doskonale radzi sobie z konwersją formatów plików, na przykład unikając przypadkowego zniszczenia plików binarnych, co jest nieco zbyt łatwe, jeśli po prostu ścigasz się zmieniając każdy CRLF, który widzisz ...źródło
Dotychczasowe rozwiązania dotyczą tylko części problemu, przekształcając CRLF DOS / Windows w LF Unixa; brakuje im tylko tego, że DOS używa CRLF jako separatora linii , podczas gdy Unix używa LF jako terminatora linii . Różnica polega na tym, że plik DOS (zwykle) nie będzie miał nic po ostatniej linii pliku, podczas gdy Unix będzie. Aby poprawnie wykonać konwersję, musisz dodać ten końcowy LF (chyba że plik ma zerową długość, tj. Nie ma w nim żadnych linii). Moje ulubione zaklęcie do tego (z nieco dodaną logiką do obsługi plików rozdzielonych CR w stylu Mac, a nie molestujących plików, które są już w formacie unixowym) to trochę perl:
Zauważ, że wysyła to Unixified wersję pliku na standardowe wyjście. Jeśli chcesz zastąpić plik wersją Unixified, dodaj
-i
flagę perla .źródło
Jeśli nie masz dostępu do dos2unix , ale możesz przeczytać tę stronę, możesz skopiować / wkleić dos2unix.py z tego miejsca.
Przeniesiony z superużytkownika .
źródło
dos2unix
konwertuje wszystkie pliki wejściowe. Twoje użycie oznacza-n
parametr. A prawdziwydos2unix
to filtr, który odczytuje ze standardowego wejścia, zapisuje na standardowe wyjście, jeśli pliki nie są podane.Łatwe kopiowanie z PCRE;
Jako skrypt lub zamień na
$@
swoje pliki.źródło
--
. Wybrałem to rozwiązanie, ponieważ jest dla mnie łatwe do zrozumienia i dostosowania. Do Twojej dyspozycji są przełączniki:-p
załóż pętlę „while input”,-i
edytuj plik wejściowy na miejscu,-e
wykonaj następujące polecenieJeszcze prostsze rozwiązanie awk bez programu:
Technicznie „1” to twój program, b / c awk wymaga jednego, gdy podano opcję.
AKTUALIZACJA : Po ponownym odwiedzeniu tej strony od dłuższego czasu zdałem sobie sprawę, że nikt jeszcze nie opublikował wewnętrznego rozwiązania, więc oto jedno:
źródło
awk -v RS='\r\n' '1' dos.txt > unix.txt
awk
lubsed
rozwiązanie. Musisz także użyć,while IFS= read -r line
aby wiernie zachować linie wejściowe, w przeciwnym razie początkowe i końcowe białe znaki zostaną przycięte (alternatywnie, nie używaj nazwy zmiennej wread
poleceniu i pracuj z$REPLY
).Musiałem tylko zastanowić się nad tym samym pytaniem (po stronie Windows, ale równie dobrze dotyczy Linuksa). Zaskakująco nikt nie wspomniał o bardzo zautomatyzowanym sposobie wykonywania konwersji CRLF <-> LF dla plików tekstowych przy użyciu starej dobrej
zip -ll
opcji (Info-ZIP):UWAGA: spowoduje to utworzenie pliku zip z zachowaniem oryginalnych nazw plików, ale konwersją zakończeń linii do LF. Następnie
unzip
rozpakowałbym pliki jako skompresowane, czyli z ich oryginalnymi nazwami (ale z końcówkami LF), prosząc w ten sposób o zastąpienie lokalnych oryginalnych plików, jeśli takie istnieją.Odpowiedni fragment z
zip --help
:źródło
co ciekawe w mojej git-bash na Windowsie
sed ""
zrobiłem już lewę:Domyślam się, że sed ignoruje je podczas odczytu linii z wejścia i zawsze zapisuje na wyjściu zakończenia linii unixowych.
źródło
To zadziałało dla mnie
źródło
W przypadku systemu Mac OSX, jeśli masz zainstalowany program Homebrew [ http://brew.sh/][1]
Upewnij się, że wykonałeś kopie plików, ponieważ to polecenie zmodyfikuje pliki na miejscu. Opcja -c mac sprawia, że przełącznik jest zgodny z systemem osx.
źródło
-c mac
, czyli do konwertowaniaCR
tylko nowych linii przed systemem OS X. Chcesz używać tego trybu tylko do plików do i z Mac OS 9 lub wcześniejszych.TIMTOWTDI!
Na podstawie @GordonDavisson
Należy wziąć pod uwagę możliwość
[noeol]
...źródło
Możesz użyć awk. Ustaw separator rekordów (
RS
) na wyrażenie regularne, które pasuje do wszystkich możliwych znaków nowej linii lub znaków. I ustaw separator rekordów wyjściowych (ORS
) na znak nowej linii w stylu uniksowym.źródło
git diff
pokazuje ^ M, edytowany w vimie)W Linuksie łatwo jest przekonwertować ^ M (ctrl-M) na * nix nowe linie (^ J) za pomocą sed.
Będzie to coś takiego w interfejsie CLI, tak naprawdę nastąpi przerwanie linii w tekście. Jednak \ przekazuje to ^ J do sed:
Możesz to zrobić, używając ^ V (ctrl-V), ^ M (ctrl-M) i \ (ukośnik odwrotny) podczas pisania:
źródło
Ponieważ w pytaniu mowa jest o sed, jest to najprostszy sposób użycia sed, aby to osiągnąć. To, co mówi to wyrażenie, zastępuje wszystkie znaki powrotu karetki i znak wiersza tylko wierszami. Właśnie tego potrzebujesz, kiedy przechodzisz z Windowsa na Unixa. Sprawdziłem, czy to działa.
źródło
Jako rozszerzenie rozwiązania Jonathan Leffler Unix na DOS, aby bezpiecznie przekonwertować na DOS, gdy nie masz pewności co do bieżących zakończeń linii pliku:
To sprawdza, czy linia nie kończy się na CRLF przed konwersją do CRLF.
źródło
Stworzyłem skrypt w oparciu o zaakceptowaną odpowiedź, więc możesz go przekonwertować bezpośrednio, bez potrzeby dodatkowego pliku na końcu, a następnie usunąć i zmienić jego nazwę.
tylko upewnij się, że jeśli masz plik taki jak „plik1.txt”, że „plik1.txt2” jeszcze nie istnieje lub zostanie zastąpiony, używam go jako tymczasowego miejsca do przechowywania pliku.
źródło
W wersji bash 4.2 i nowszych możesz użyć czegoś takiego do usunięcia końcowego CR, który wykorzystuje tylko wbudowane bash:
źródło
Próbowałem sed 's / ^ M $ //' file.txt na OSX, a także kilka innych metod ( http://www.thingy-ma-jig.co.uk/blog/25-11-2010/fixing- dos-line-endings lub http://hintsforums.macworld.com/archive/index.php/t-125.html ). Żaden nie działał, plik pozostał niezmieniony (do odtworzenia ^ M potrzebny był Ctrl-v Enter). W końcu użyłem TextWrangler. Nie jest to ściśle wiersz poleceń, ale działa i nie narzeka.
źródło