Làm cách nào để chuyển đổi ngắt dòng trong tệp văn bản giữa các định dạng Windows và Unix / Linux?


33

Làm cách nào để chuyển đổi ngắt dòng trong tệp văn bản giữa các định dạng Windows và Unix / Linux?

Tôi có môi trường * nix, nhưng tôi cần nhập và xuất dữ liệu với các ngắt dòng kiểu Windows. Tôi nghĩ rằng sẽ có một tiện ích hoặc lệnh tiêu chuẩn để làm điều này, nhưng dường như tôi không thể tìm thấy nó.

Câu trả lời:


42

Có lẽ bạn đang tìm kiếm dos2unix, unix2dos, todoshoặc fromdostùy thuộc vào phân phối của bạn. Gói Ubuntu / Debian todos/ fromdoslà một phần của gói tofrodos từ bộ nhớ.


4
Trong trường hợp bất kỳ ai gặp phải câu hỏi này để tìm giải pháp cho Windows, trang web ngược dòng dos2unixwaterlan.home.xs4all.nl/dos2unix.html và nó cũng hoạt động trong Windows.
womble

Bạn có thể cài đặt dos2unix/unix2dos trên Mac OS X bằng Homebrew . Với Homebrew được cài đặt, lệnh này brew install dos2unixsử dụng công thức này .
Rory O'Kane

24

Một tùy chọn là sử dụng unix2dos(và dos2unixđể quay lại) trên dòng lệnh.

Một cách khác là sử dụng trình soạn thảo văn bản:
Đối với vi :: set ff = dos để đặt các kết thúc dòng thành kết thúc dòng dos.
Đối với emacs: Cx [ENTER] f dos [ENTER]

Đối với trình chỉnh sửa dựa trên GUI yêu thích của bạn (ví dụ: jedit) Tôi khuyên bạn nên kiểm tra hướng dẫn hoặc Google.

Cuối cùng, nếu bạn không muốn đối phó với trình soạn thảo văn bản và chỉ cần sử dụng các tiện ích phổ biến hơn và như vậy (hoặc không cài đặt unix2dos):

tr -d '\r' < infile > outfileđi từ Windows -> Unix
awk 'sub("$", "\r")' unixfile.txt > winfile.txtđi từ Unix -> Windows vì trkhông thể chuyển từ Unix sang Windows.


dos2unix đã thực hiện thủ thuật này, tuy nhiên nhờ có tiện ích tr, nó có thể đã tiết kiệm rất nhiều thời gian trong quá khứ!
alexeit

Nếu một tệp có kết thúc dòng hỗn hợp, hãy đảm bảo tải nó đúng cách ff: :e ++ff=unix. Ít nhất nó có ý nghĩa cho việc dos -> unixchuyển đổi.
x-yuri

Đó là một lót đang dạy một người đàn ông câu cá, cảm ơn vì điều đó. Tôi sẽ bớt đói hơn một chút trong tương lai
Gareth Davidson

13

Chỉnh sửa nó trong Vim và sử dụng set fileformatlệnh.

  • MS-DOS / Windows (CR + LF ngắt) thành * nix (chỉ ngắt)

    :set fileformat=unix
    :wq
    
  • * kết hợp với MS-DOS / Windows

    :set fileformat=dos
    :wq
    

Hãy cẩn thận khi sử dụng nếu tệp chưa bị ngắt dòng ở dòng cuối cùng; vim sẽ thêm một cái trừ khi bạn biết làm thế nào để không nói.
CesarB

Sau nhiều giờ cố gắng mọi giải pháp khác, đây là cứu cánh tôi cần. Hành vi được xác nhận trên OS X Yosemite với hexdump -C- cũng xác nhận đây không phảilỗi - nó được đặt cho mỗi viphiên
Techmag

8

Đây là những gì tôi sử dụng, tương tự như Chealion, để chuyển đổi kết thúc dòng Windows sang Unix:

tr -d \\015 < windows > unix

Các poster muốn unix để kết thúc dòng cửa sổ. Và bạn trả lời trễ vài năm.
ott--

5
Ai quan tâm nếu đó là "năm muộn"? Nó vẫn hoạt động, và nó vẫn có thể áp dụng cho câu hỏi. Tôi chỉ thêm một lựa chọn khác cho những người đọc đến với nó, giống như tôi. Ngoài ra, câu hỏi của anh ta yêu cầu Windows -> Unix và mô tả của anh ta yêu cầu Unix -> Windows. nhún vai
Josh

Đúng. Có lẽ bạn thêm lệnh tr khác để chuyển đổi unix sang windows rồi.
ott--

Tôi đã cố gắng hoàn tác downvote, nhưng nó nói rằng nó bị khóa cho đến khi bài viết được chỉnh sửa.
ott--

@ ott-- không có vấn đề gì, tôi ủng hộ bạn. ... Đợi đã, bây giờ tôi không thể ủng hộ tôi! ... dang ... :)
Alois Mahdal

1

Làm điều này với POSIX rất khó:

  • POSIX Sed không hỗ trợ \rhoặc \15. Ngay cả khi nó đã làm, tùy chọn tại chỗ -ikhông phải là POSIX

  • POSIX Awk không hỗ trợ \r\15tuy nhiên -i inplacetùy chọn không phải là POSIX

  • d2udos2unix không phải là tiện ích POSIX , nhưng ex

  • POSIX cũ không hỗ trợ \r, \15, \nhoặc\12

Để loại bỏ trả lại vận chuyển:

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

Để thêm lợi nhuận vận chuyển:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\n","\r&");print>ARGV[1]}' file
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.