Bagaimana cara menambahkan carriage return sebelum setiap baris?

28

Saya memiliki file yang hanya digunakan \nuntuk baris baru, tetapi saya harus memilikinya \r\nuntuk setiap baris baru. Bagaimana saya bisa melakukan ini?

Sebagai contoh, saya menyelesaikannya dalam Vim menggunakan :%s/\n/\r\n/g, tetapi saya ingin menggunakan skrip atau aplikasi baris perintah. Ada saran?

Saya mencoba mencari ini dengan sedatau grep, tapi saya langsung bingung dengan solusi urutan melarikan diri (saya agak hijau dengan perintah ini).

Jika tertarik, aplikasi terkait dengan pertanyaan / jawaban saya di sini

modulitos
sumber

Jawaban:

36

Anda dapat menggunakan unix2dos (yang ditemukan di Debian):

unix2dos file

Perhatikan bahwa implementasi ini tidak akan memasukkan CRsebelum setiap LF, hanya sebelum mereka LFs yang belum didahului oleh satu (dan hanya satu) CRdan akan melewatkan file biner (yang mengandung nilai-nilai byte di 0x0 yang -> 0x1f berkisar selain LF, FF, TABatau CR).

atau gunakan sed:

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

atau gunakan awk:

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

atau gunakan perl:

perl -pe 's|\n|\r\n|' file
cuonglm
sumber
Perhatikan bahwa unix2dox tidak akan menyisipkan CRsebelum setiap LF, hanya sebelum LF yang belum didahului oleh satu (dan hanya satu) CR.
Stéphane Chazelas
@ StéphaneChazelas: Terima kasih untuk intinya, menambahkannya ke jawaban saya.
cuonglm
1
Sepotong informasi penting bagi saya di sini adalah menggunakan '\r'dengan sedmelakukan trik.
rkersh
8

Inilah yang unix2dosdilakukannya:

$ unix2dos file.txt

Itu akan menggantikan file.txt di tempat dengan versi dengan ujung garis CRLF.

Jika Anda ingin melakukannya sed, Anda dapat memasukkan carriage return di akhir setiap baris:

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

Ini menggantikan ( s) area ukuran nol tepat sebelum akhir baris ( $) dengan \r. Untuk melakukan penggantian di tempat (seperti unix2doshalnya), gunakan sed -i.bak, meskipun itu adalah ekstensi non-standar - jika Anda tidak memilikinya, gunakan file sementara.

Michael Homer
sumber
3
Penggunaan \rpengganti tidak portabel. Paling tidak, itu tidak akan berfungsi di Mac OSX.
cuonglm
Perhatikan bahwa ada beberapa implementasi unix2dos. Anda mungkin ingin memberikan tautan ke halaman beranda dari implementasi tertentu (seperti waterlan.home.xs4all.nl/dos2unix.html seperti yang ditemukan di Debian) alih-alih linux.die.net/man yang tidak menjelaskan mana implementasi (atau versi) didokumentasikan. Perhatikan bahwa ada beberapa u2d, ux2dos, todosperintah sekitar juga.
Stéphane Chazelas
2

Jika Anda melakukan konversi pada mesin Unix (OS X, Linux), buka file dengan viatau vim:

$ vim my-file

tekan tombol ESC untuk memastikan bahwa Anda tidak berada dalam mode memasukkan, lalu ketik

:set ff=dos

atau

:set fileformat=dos

Ini konversi di tempat dengan mengatur format file.

Untuk menulis file dan keluar dari penggunaan editor

:wq

Di baris perintah yang bisa Anda lakukan

$ vi +':w ++ff=dos' +':q' my-file
Peter Evans
sumber
terima kasih telah menjelaskan semua langkah - untuk pemula ini membuatnya lebih mudah untuk memahami apa yang sedang terjadi.
user3616725
2

Melakukan ini dengan POSIX itu rumit:

  • POSIX Sed tidak mendukung \ratau \15. Bahkan jika itu terjadi, opsi di tempat -ibukanlah POSIX

  • POSIX Awk mendukung \rdan \15, bagaimanapun, -i inplacepilihannya bukan POSIX

  • d2u dan dos2unix bukan utilitas POSIX , tetapi ex adalah

  • POSIX ex tidak mendukung \r, \15, \natau\12

Untuk menghapus pengembalian carriage:

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

Untuk menambahkan carriage return:

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

Fungsi shell portabel yang akan melakukan ini:

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

Dengan itu Anda bisa melakukan:

u2dos file >dosfile
mikeserv
sumber
1

Dalam awk Anda dapat mencoba

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

Atau

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

The $'\r'adalah contoh dari gaya ANSI-C mengutip karena didukung oleh beberapa kerang seperti ksh93, bash, zsh, mkshdan FreeBSD sh dan cenderung dimasukkan dalam edisi 8 Single Unix Specification .

Ini menawarkan cara umum untuk mengekspresikan karakter aneh, coba ini, misalnya:

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