วิธีเพิ่มการขึ้นบรรทัดใหม่ก่อนขึ้นบรรทัดใหม่ทุกครั้ง


28

ฉันมีไฟล์ที่ใช้\nสำหรับบรรทัดใหม่เท่านั้น แต่ฉันต้องการให้มี\r\nสำหรับแต่ละบรรทัดใหม่ ฉันจะทำสิ่งนี้ได้อย่างไร

ตัวอย่างเช่นฉันแก้ไขในการใช้ Vim :%s/\n/\r\n/gแต่ฉันต้องการใช้สคริปต์หรือแอปพลิเคชันบรรทัดคำสั่ง ข้อเสนอแนะใด ๆ

ฉันพยายามค้นหาสิ่งนี้ด้วยsedหรือgrepแต่ฉันสับสนทันทีโดยวิธีแก้ปัญหาลำดับหนี (ฉันเป็นสีเขียวเล็กน้อยด้วยคำสั่งเหล่านี้)

หากสนใจแอปพลิเคชันจะเกี่ยวข้องกับคำถาม / คำตอบของฉันที่นี่

คำตอบ:


36

คุณสามารถใช้unix2dos (ซึ่งพบใน Debian):

unix2dos file

โปรดทราบว่าการดำเนินการนี้จะไม่ใส่CRทุกครั้งก่อนLFเท่านั้นก่อนที่ผู้LFs ที่ไม่ได้นำหน้าแล้วโดยหนึ่ง (และมีเพียงหนึ่ง) CRและจะข้ามไฟล์ไบนารี (ผู้ที่มีค่าไบต์ใน 0x0 ค่า -> 0x1f ช่วงอื่น ๆ กว่าLF, FF, TABหรือCR)

หรือใช้sed:

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

หรือใช้awk:

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

หรือใช้perl:

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

โปรดทราบว่าunix2doxจะไม่แทรกCRก่อนหน้าLF ทุกตัวเท่านั้นก่อน LF เหล่านั้นที่ไม่ได้นำหน้าด้วยหนึ่ง CR (และเพียงหนึ่ง) CR
Stéphane Chazelas

@ StéphaneChazelas: ขอบคุณสำหรับจุดที่เพิ่มเข้าไปในคำตอบของฉัน
cuonglm

1
ข้อมูลสำคัญสำหรับฉันที่นี่คือการใช้'\r'กับsedการหลอกลวง
rkersh

8

นี่คือสิ่งที่unix2dos:

$ unix2dos file.txt

ที่จะแทนที่แบบแทนที่file.txtด้วยเวอร์ชันที่ลงท้ายด้วยบรรทัด CRLF

หากคุณต้องการทำด้วยsedคุณสามารถแทรกการขึ้นบรรทัดใหม่ที่ท้ายบรรทัดทุกบรรทัดได้:

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

แทนที่นี้ ( s) ศูนย์ขนาดพื้นที่ด้านขวาก่อนที่จะสิ้นสุดของเส้น (คน$) \rด้วย หากต้องการแทนที่แบบแทนที่ (เช่นเดียวกับunix2dos) ให้ใช้sed -i.bakแม้ว่าจะเป็นส่วนขยายที่ไม่ได้มาตรฐานหากคุณไม่มีให้ใช้ไฟล์ชั่วคราว


3
ใช้\rแทนไม่ได้พกพา อย่างน้อยมันจะไม่ทำงานใน Mac OSX
cuonglm

โปรดทราบว่ามีการใช้งานหลาย unix2dos คุณอาจต้องการให้ลิงก์ไปยังหน้าแรกของการใช้งานเฉพาะ (เช่นwaterlan.home.xs4all.nl/dos2unix.htmlเท่าที่พบใน Debian) แทนlinux.die.net/manซึ่งไม่ได้ทำให้ชัดเจนซึ่ง มีการนำเอกสาร (หรือรุ่น) ไปใช้ หมายเหตุว่ามีบางu2d, ux2dos, todosคำสั่งไปรอบ ๆ ได้เป็นอย่างดี
Stéphane Chazelas

2

หากคุณกำลังทำการแปลงบนเครื่อง Unix (OS X, Linux) ให้เปิดไฟล์ด้วยviหรือvim:

$ vim my-file

กดปุ่ม ESC เพื่อให้แน่ใจว่าคุณไม่ได้อยู่ในโหมดแทรกจากนั้นพิมพ์

:set ff=dos

หรือ

:set fileformat=dos

นี่เป็นการแปลงโดยการตั้งค่ารูปแบบไฟล์

หากต้องการเขียนไฟล์และออกจากโปรแกรมแก้ไขให้ใช้

:wq

ในบรรทัดคำสั่งคุณสามารถทำได้

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

ขอบคุณสำหรับการอธิบายทุกขั้นตอน - สำหรับมือใหม่มันช่วยให้เข้าใจได้ง่ายขึ้นว่าเกิดอะไรขึ้น
3616725

2

การทำสิ่งนี้กับ POSIX นั้นยุ่งยาก:

  • POSIX Sedไม่สนับสนุนหรือ\r \15แม้ว่าจะเป็นเช่นนั้นตัวเลือก in place -iไม่ใช่ POSIX

  • POSIX Awkรองรับ\rและ\15อย่างไรก็ตาม-i inplaceตัวเลือกนี้ไม่ได้เป็น POSIX

  • d2uและdos2unixไม่ใช่POSIX ยูทิลิตี้แต่อดีตคือ

  • POSIX อดีตไม่สนับสนุน\r, \15, \nหรือ\12

หากต้องการลบ carriage return:

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

ในการเพิ่มการขึ้นบรรทัดใหม่ให้ทำดังนี้

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

1

ฟังก์ชั่นเปลือกแบบพกพาที่จะทำสิ่งนี้:

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

ด้วยสิ่งที่คุณสามารถทำได้:

u2dos file >dosfile

1

ใน awk คุณสามารถลอง

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

หรือ

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

$'\r'เป็นตัวอย่างของรูปแบบ ANSI-C อ้างเป็นการสนับสนุนจากเปลือกหอยไม่กี่เช่นksh93, bash, zsh, mkshและ FreeBSD sh และมีแนวโน้มที่จะถูกรวมอยู่ในรุ่นที่ 8 ของสเปก

มันมีวิธีการทั่วไปในการแสดงตัวละครแปลก ๆ ลองตัวอย่างเช่น:

awk -v r=$'\U0001F608' '{print $0 r}'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.