Jak konwertować podziały linii w pliku tekstowym między formatami Windows i Unix / Linux?

33

Jak przekonwertować podziały linii w pliku tekstowym między formatami Windows i Unix / Linux?

Mam środowisko * nix, ale muszę importować i eksportować dane z podziałem linii w stylu Windows. Myślałem, że będzie to standardowe narzędzie lub polecenie, ale nie mogę tego znaleźć.

alexeit
źródło

Odpowiedzi:

42

Jesteś prawdopodobnie szuka dos2unix, unix2dos, todoslub fromdosw zależności od dystrybucji. Pakiet Ubuntu / Debian todos/ fromdosjako część pakietu tofrodos z pamięci.

saschabeaumont
źródło
4
W przypadku, gdy ktoś natknie się na to pytanie, szukając rozwiązań dla systemu Windows, strona upstream dla dos2unixto waterlan.home.xs4all.nl/dos2unix.html , i działa również w systemie Windows.
womble
Możesz zainstalować dos2unix/unix2dos na Mac OS X za pomocą Homebrew . Po zainstalowaniu Homebrew polecenie to brew install dos2unixkorzysta z tej formuły .
Rory O'Kane
24

Jedną z opcji jest użycie unix2dos(i dos2unixcofnięcie) w wierszu poleceń.

Innym jest użycie edytora tekstu:
Dla vi:: ustaw ff = dos, aby ustawić zakończenia linii na zakończenia linii dos.
Dla emacsa: Cx [ENTER] f dos [ENTER]

Dla twojego ulubionego edytora opartego na GUI (np. Jedit) polecam sprawdzenie instrukcji lub Google.

Na koniec, jeśli nie chcesz zajmować się edytorem tekstu i po prostu zrób to za pomocą bardziej powszechnych narzędzi i takich (lub nie masz zainstalowanego unix2dos):

tr -d '\r' < infile > outfileprzejść z Windows -> Unix,
awk 'sub("$", "\r")' unixfile.txt > winfile.txtaby przejść z Unix -> Windows, ponieważ trnie można przejść z Unix do Windows.

Chealion
źródło
dos2unix załatwił sprawę, jednak dzięki za narzędzie tr, mógł zaoszczędzić tyle czasu w przeszłości!
alexeit
Jeżeli plik ma mieszane końca linii, należy załadować go na właściwy ff: :e ++ff=unix. Przynajmniej ma sens dos -> unixkonwersja.
x-yuri
Ten awk one liner uczy człowieka łowienia ryb, dzięki za to. W przyszłości będę nieco mniej głodny
Gareth Davidson
13

Edytuj go w Vimie i użyj set fileformatpolecenia.

  • MS-DOS / Windows (CR + LF psuje się) do * nix (tylko LF psuje się)

    :set fileformat=unix
    :wq
    
  • * nix do MS-DOS / Windows

    :set fileformat=dos
    :wq
    
nedm
źródło
Zachowaj ostrożność podczas korzystania z niego, jeśli plik nie ma już podziału linii w ostatnim wierszu; vim doda jeden, chyba że wiesz, jak to powiedzieć.
CesarB
Po godzinach próbowania każdego innego rozwiązania potrzebowałem ratownika. Potwierdzone zachowanie w systemie OS X Yosemite z hexdump -C- również potwierdzone, że nie jest lepkie - jest ustawione na visesję
Techmag
8

Oto, czego używam, podobnie jak Chealion, do konwersji systemu Windows na zakończenia linii Unix:

tr -d \\015 < windows > unix
Josh
źródło
Plakat chciał zakończenia linii Unix do Windows. I spóźniłeś się kilka lat z odpowiedzią.
ott--
5
Kogo to obchodzi, jeśli „spóźni się”? Nadal działa i nadal ma zastosowanie do pytania. Właśnie dodałem kolejną opcję dla czytelników, którzy na nią wpadli, tak jak ja. Ponadto jego pytanie dotyczy systemu Windows -> Unix, a jego opis dotyczy systemu Unix -> Windows. wzruszenie ramionami
Josh
Dobrze. Być może dodasz wtedy inne polecenie tr do konwersji Uniksa na Windows.
ott--
Próbowałem cofnąć głosowanie, ale było napisane, że jest zablokowane, dopóki artykuł nie zostanie zredagowany.
ott--
@ ott-- nie ma problemu, głosowałem za ciebie. ... czekaj, teraz nie mogę głosować za mną! ... cholera ... :)
Alois Mahdal
1

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