Jak dodać zwrot karetki przed każdą nową linią?

28

Mam plik, który używa tylko \ndla nowych linii, ale muszę go mieć \r\ndla każdej nowej linii. W jaki sposób mogę to zrobić?

Na przykład rozwiązałem go w Vimie :%s/\n/\r\n/g, ale chciałbym użyć skryptu lub aplikacji wiersza poleceń. Jakieś sugestie?

Próbowałem to sprawdzić za pomocą sedlub grep, ale od razu pomyliły mnie obejścia sekwencji ucieczki (jestem trochę zielony z tymi poleceniami).

W razie zainteresowania aplikacja jest powiązana z moim pytaniem / odpowiedzią tutaj

modulitos
źródło

Odpowiedzi:

36

Możesz użyć unix2dos (które znaleziono na Debianie):

unix2dos file

Zauważ, że ta realizacja nie będzie wstawić CRprzed każdym LF, tylko przed tymi LFs, które nie są już poprzedzonych jeden (i tylko jeden) CRi pominie pliki binarne (te, które zawierają wartości bajtów w 0x0 -> 0x1F wahają inny niż LF, FF, TABlub CR).

lub użyj sed:

CR=$(printf '\r')
sed "s/\$/$CR/" file

lub użyj awk:

awk '{printf "%s\r\n", $0}' file

lub użyj perl:

perl -pe 's|\n|\r\n|' file
Cuonglm
źródło
Zauważ, że unix2dox nie wstawi CRprzed każdym LF, tylko przed tymi LF, które nie są jeszcze poprzedzone jednym (i tylko jednym) CR.
Stéphane Chazelas
@ StéphaneChazelas: Dzięki za punkt dodałem go do mojej odpowiedzi.
cuonglm
1
Kluczową informacją dla mnie tutaj używał '\r'z sedzałatwia sprawę.
rkersh
8

Właśnie to unix2dosrobi:

$ unix2dos file.txt

To zastąpi file.txtna miejscu wersję z zakończeniami linii CRLF.

Jeśli chcesz to zrobić sed, możesz wstawić znak powrotu karetki na końcu każdej linii:

sed -e 's/$/\r/' file.txt

Zastępuje ( s) obszar o zerowym rozmiarze tuż przed końcem linii ( $) znakiem \r. Aby dokonać zamiany na miejscu (podobnie jak unix2dosrobi), użyj sed -i.bak, chociaż jest to niestandardowe rozszerzenie - jeśli go nie masz, użyj pliku tymczasowego.

Michael Homer
źródło
3
Użycie \rzastępcze nie jest przenośne. Przynajmniej nie będzie działać w systemie Mac OSX.
cuonglm
Zauważ, że istnieje kilka implementacji unix2dos. Możesz podać link do strony głównej konkretnej implementacji (np. Waterlan.home.xs4all.nl/dos2unix.html znaleziony w Debianie) zamiast linux.die.net/man, co nie wyjaśnia, który z nich implementacja (lub wersja) jest udokumentowana. Należy zauważyć, że istnieją pewne u2d, ux2dos, todosnakazuje wokół także.
Stéphane Chazelas
2

Jeśli wykonujesz konwersję na komputerze z systemem Unix (OS X, Linux), otwórz plik za pomocą vilub vim:

$ vim my-file

naciśnij klawisz ESC, aby upewnić się, że nie jesteś w trybie wstawiania, a następnie wpisz

:set ff=dos

lub

:set fileformat=dos

Dokonuje konwersji w miejscu przez ustawienie formatu pliku.

Aby zapisać plik i wyjść z edytora, użyj

:wq

W wierszu poleceń możesz to zrobić

$ vi +':w ++ff=dos' +':q' my-file
Peter Evans
źródło
dzięki za wyjaśnienie wszystkich kroków - dla początkujących znacznie łatwiej zrozumieć, co się dzieje.
user3616725 19.04.17
2

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

  • d2u i dos2unix nie są narzędziami POSIX , ale ex jest

  • POSIX ex nie obsługuje \r, \15, \nlub\12

Aby usunąć zwroty karetki:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\r","");print>ARGV[1]}' file

Aby dodać zwrot karetki:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\n","\r&");print>ARGV[1]}' file
Steven Penny
źródło
1

Przenośna funkcja powłoki, która to zrobi:

u2dos() (set -f; IFS='
'; printf '%s\r\n' $(cat "$1"))

Dzięki temu możesz:

u2dos file >dosfile
mikeserv
źródło
1

W awk możesz spróbować

awk '{print $0 "\r"}'

Lub

awk -v r=$'\r' '{print $0 r}'

$'\r'Jest przykładem stylu ANSI-C podając jako obsługiwany przez kilka muszli jak ksh93, bash, zsh, mkshi FreeBSD sh i mogą być zawarte w numerze 8 Single Unix Specification .

Oferuje ogólny sposób wyrażania dziwnych postaci, spróbuj tego, na przykład:

awk -v r=$'\U0001F608' '{print $0 r}'
trepanger
źródło