Làm thế nào để thêm một sự trở lại vận chuyển trước mỗi dòng mới?


28

Tôi có một tệp chỉ sử dụng \ncho các dòng mới, nhưng tôi cần nó có \r\ncho mỗi dòng mới. Tôi có thể làm cái này như thế nào?

Ví dụ, tôi đã giải quyết nó trong Vim bằng cách sử dụng :%s/\n/\r\n/g, nhưng tôi muốn sử dụng một tập lệnh hoặc ứng dụng dòng lệnh. Bất kỳ đề xuất?

Tôi đã thử tìm kiếm cái này với sedhoặc grep, nhưng tôi đã bị nhầm lẫn ngay lập tức bởi các cách giải quyết trình tự thoát (tôi hơi xanh với các lệnh này).

Nếu quan tâm, ứng dụng có liên quan đến câu hỏi / câu trả lời của tôi ở đây

Câu trả lời:


36

Bạn có thể sử dụng unix2dos (được tìm thấy trên Debian):

unix2dos file

Lưu ý rằng việc thực hiện này sẽ không chèn một CRtrước mỗi LF, chỉ trước những LFs mà chưa được đi trước bởi một (và chỉ một) CRvà sẽ bỏ qua tập tin nhị phân (những người mà chứa các giá trị byte trong 0x0 -> 0x1f dao khác hơn LF, FF, TABhoặc CR).

hoặc sử dụng sed:

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

hoặc sử dụng awk:

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

hoặc sử dụng perl:

perl -pe 's|\n|\r\n|' file

Lưu ý rằng unix2dox sẽ không chèn a CRtrước mỗi LF, chỉ trước các LF chưa được đặt trước một (và chỉ một) CR.
Stéphane Chazelas

@ StéphaneChazelas: Cảm ơn bạn đã thêm điểm vào câu trả lời của tôi.
cuonglm

1
Mấu chốt của thông tin đối với tôi ở đây là sử dụng '\r'với sedthủ thuật.
rkersh

8

Đây chính xác là những gì unix2dos:

$ unix2dos file.txt

Điều đó sẽ thay thế file.txttại chỗ bằng một phiên bản có kết thúc dòng CRLF.

Nếu bạn muốn làm điều đó với sed, bạn có thể chèn trở lại vận chuyển ở cuối mỗi dòng:

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

Điều này thay thế ( s) khu vực kích thước không ngay trước khi kết thúc dòng ( $) bằng \r. Để thực hiện thay thế tại chỗ (như unix2doshiện tại), hãy sử dụng sed -i.bak, mặc dù đó là tiện ích mở rộng không chuẩn - nếu bạn không có, hãy sử dụng tệp tạm thời.


3
Sử dụng \rthay thế không phải là di động. Ít nhất, nó sẽ không hoạt động trong Mac OSX.
cuonglm

Lưu ý rằng có một số triển khai của unix2dos. Bạn có thể muốn cung cấp một liên kết đến trang chủ của một triển khai cụ thể (như waterlan.home.xs4all.nl/dos2unix.html như được tìm thấy trên Debian) thay vì linux.die.net/man mà không làm rõ thực hiện (hoặc phiên bản) được ghi lại. Lưu ý rằng có một số u2d, ux2dos, todoslệnh xung quanh là tốt.
Stéphane Chazelas

2

Nếu bạn đang thực hiện chuyển đổi trên máy Unix (OS X, Linux), hãy mở tệp bằng vihoặc vim:

$ vim my-file

nhấn phím ESC để đảm bảo rằng bạn không ở chế độ chèn, sau đó nhập

:set ff=dos

hoặc là

:set fileformat=dos

Điều này không chuyển đổi tại chỗ bằng cách đặt định dạng tệp.

Để viết tệp và thoát khỏi trình soạn thảo, hãy sử dụng

:wq

Trên dòng lệnh bạn có thể làm

$ vi +':w ++ff=dos' +':q' my-file

cảm ơn vì đã giải thích tất cả các bước - đối với một người mới, nó giúp dễ hiểu hơn những gì đang diễn ra.
dùng3616725

2

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

  • POSIX Sed không hỗ trợ \rhoặc \15. Ngay cả nếu có, 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

1

Một chức năng vỏ di động sẽ làm điều này:

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

Với điều đó bạn có thể làm:

u2dos file >dosfile

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.