แปลงจุดสิ้นสุดบรรทัด DOS เป็นจุดสิ้นสุดบรรทัด Linux ในกลุ่ม


717

ถ้าผมเปิดไฟล์ฉันสร้างขึ้นใน Windows ^Mเส้นสิ้นทั้งหมดที่มี
ฉันจะลบตัวละครเหล่านี้ทั้งหมดในครั้งเดียวได้อย่างไร


หากคุณทำhexdump -C badfileและเห็น0x0d 0x0a "\r\n"ว่าเป็นปัญหาของคุณ
Yzmir Ramirez

คำตอบ:


1074

dos2unixเป็นอรรถประโยชน์บรรทัดคำสั่งที่จะทำเช่นนี้หรือ:%s/^M//gจะถ้าคุณใช้Ctrl- v Ctrl- mเพื่อป้อน ^ M หรือคุณสามารถ:set ff=unixและเป็นกลุ่มจะทำเพื่อคุณ

เอกสารที่ 'fileformat' ตั้งอยู่ที่นี่และเป็นกลุ่มวิกิพีเดียมีครอบคลุมหน้าแปลงสายสิ้นสุด

อีกทางเลือกหนึ่งถ้าคุณย้ายไฟล์ไปมาบ่อยครั้งคุณอาจไม่ต้องการแปลงไฟล์ แต่ควรทำเช่น:set ff=dosนั้นดังนั้นกลุ่มจะรู้ว่ามันเป็นไฟล์ DOS และใช้การประชุม DOS สำหรับการสิ้นสุดบรรทัด


56
:%s/^M//gควรเป็น:%s/\r//gเพราะ^Mหมายถึง "จับคู่เงินทุน" M "ที่จุดเริ่มต้นของบรรทัด"
Bunyk

78
ไม่ใช่ถ้าคุณทำตามคำตอบที่บอกไว้และ 'ใช้ ctrl-v ctrl-m เพื่อป้อน ^ M'
pjz

2
crtl-vไม่ดีบน windows มันวางเนื้อหาคลิปบอร์ดไปยังบรรทัดคำสั่ง โซลูชัน:%s/\r//gทำงานให้ฉันไชโย @Bunyk
roblogic

3
@ropata สิ่งที่คุณต้องการบน Windows เป็นCtrl-Q
ruffin

2
ฉันต้องคิดถึงบางสิ่งบางอย่างเพราะset ff=unixไม่ทำอะไรเลย อาจจะแปลงไฟล์ แต่^Mตัวละครทั้งหมดยังคงอยู่ที่นั่น
felwithe

276

เปลี่ยนการสิ้นสุดบรรทัดในมุมมอง:

:e ++ff=dos
:e ++ff=mac
:e ++ff=unix

นอกจากนี้ยังสามารถใช้เป็นการดำเนินการบันทึก (: w เพียงอย่างเดียวจะไม่บันทึกโดยใช้จุดสิ้นสุดบรรทัดที่คุณเห็นบนหน้าจอ):

:w ++ff=dos
:w ++ff=mac
:w ++ff=unix

และคุณสามารถใช้มันจาก command-line:

for file in *.cpp
do 
    vi +':w ++ff=unix' +':q' "$file"
done

4
ขอบคุณมาก. ฉันลอง vi + ': wq ++ ff = unix' <filepath> สำหรับคนขี้เกียจอย่างฉัน
a_secenthusiast

2
นี่ควรเป็นคำตอบที่ได้รับการโหวตมากที่สุด :w +ff=unixดีกว่าสิ่งอื่น ๆ ส่วนใหญ่ที่เขียนไว้ที่นี่และสคริปต์ทุบตีเป็นโบนัสที่ดี
mkasberg

:eคำสั่งดูเหมือนจะไม่ได้ทำอะไรบน Windows ของฉันเป็นกลุ่มติดตั้ง มุมมองของฉันยังคงแสดง^Mรหัส
สิทธิ์ Birchmeier

160

ฉันมักจะใช้

:%s/\r/\r/g

ซึ่งดูเหมือนว่าแปลก ๆ แต่ทำงานได้เนื่องจากวิธีที่กลุ่มจับคู่ฟีดฟีด ฉันยังจำได้ง่ายขึ้น :)


9
สิ่งนี้ทำงานได้อย่างต่อเนื่องในทุกแพลตฟอร์ม คำตอบที่ดีที่สุดที่นี่
thebigjc

4
ฉันไม่เคยมีปัญหาใด ๆ:set ff=unixมาก่อน แต่ไฟล์ที่ฉันเปิดในวันนี้จะต้องแปลกโดยเฉพาะ ที่เป็นกลุ่มบอกว่ามันเป็นอยู่แล้วแต่ทั้งหมดที่ปลายสายได้fileformat=unix ^Mวิธีนี้ใช้ได้ผลสำหรับฉัน
Chris B

15
โซลูชันนี้เพิ่มบรรทัดพิเศษที่ไม่ต้องการให้ฉันเพิ่มจำนวนบรรทัดในไฟล์เป็นสองเท่า :%s/\r//gทำงานแทนฉัน
Victor Zamanian

3
มีชัยไฟล์ของคุณน่าจะจบได้ \ r \ n \ r ไม่ได้ถูกอ่านเป็นบรรทัดใหม่ แต่ \ n คือ ในไฟล์ที่ฉันเจอคือ \ r และคุณต้องเพิ่มอักขระขึ้นบรรทัดใหม่
Joeyjoejoejr

2
@ VictorZamanian :%s/\r//gเป็นทางออกทั่วไปเพียงอย่างเดียว - โดยเฉพาะอย่างยิ่งสำหรับไฟล์แบบผสมที่มีส่วนผสมที่ต่างกันของการขึ้นบรรทัดใหม่สไตล์ DOS และ UNIX โซลูชั่นที่ยอมรับ (เช่น:set ff=unix, :e ++ff=unix) ถือว่าสายของบัฟเฟอร์ปลายปัจจุบันทุกคนในรูปแบบเดียวกันขึ้นบรรทัดใหม่ บางครั้งพวกเขาทำ; บางครั้งพวกเขาทำไม่ได้ คิว sadface
เซซิลแกงกะหรี่

97

ฉันชอบที่จะใช้คำสั่งต่อไปนี้:

:set fileformat=unix

นอกจากนี้คุณยังสามารถใช้macหรือdosแปลงไฟล์ของคุณเป็นแบบ Macintosh หรือ MS-DOS / MS-Windows และจะไม่ทำอะไรเลยหากไฟล์นั้นมีรูปแบบที่ถูกต้องอยู่แล้ว

สำหรับข้อมูลเพิ่มเติมดูวิธีใช้กลุ่ม:

:help fileformat

1
คำสั่งนี้ดูเหมือนจะไม่ทำอะไรเลยใน Windows vim ของฉัน มุมมองของฉันยังคงมี^Mตัวอักษรอยู่ในนั้น
Birchmeier

การเพิ่มset fileformat=unixไฟล์. vimrc ของฉันทำงานได้
Joey Allen

20

:set fileformat=unix การแปลงจาก dos เป็นยูนิกซ์


1
นี่แก้ไขปัญหาสำหรับฉันแล้ว ฉันไม่สามารถค้นหาตัวละครเหล่านั้นขณะค้นหา
Captain Insaneo

20
:%s/\r+//g

ใน Vim นั้นจะดึงการขึ้นบรรทัดใหม่ทั้งหมดออกจากบรรทัดใหม่เท่านั้น


2
ด้วยเหตุผลบางอย่างข้างต้นไม่ได้ผลสำหรับฉันภายใต้ windows gvim แต่เมื่อเปลี่ยนเป็น:%s/\r//gมันใช้งานได้เหมือนมีเสน่ห์
soltysh

1
@soltysh:% s / \ r \ + $ // g
thinker3

14

+1 สำหรับการชี้ไปยังไซต์เอกสารทางการ สำหรับทุกคนที่ใช้ลิงก์ด้านบนให้ดูส่วน "การแปลงไฟล์ปัจจุบัน" ในหน้านั้น
ชายดีบุก

+ vim -b <filename> นี้ทำงานได้อย่างมีเสน่ห์ขอบคุณ +1
Jan Molak

10

แปลงไดเรกทอรีของไฟล์จาก dos เป็น Unix

ใช้บรรทัดคำสั่งและค้นหาค้นหาไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันด้วยนามสกุล ".ext" และลบ "^ M" ทั้งหมด

@ https://gist.github.com/sparkida/7773170

find $(pwd) -type f -name "*.ext" | while read file; do sed -e 's/^M//g' -i "$file"; done;

ตามที่กล่าวไว้ข้างต้น^ M = Ctrl+V+ Ctrl+M(ไม่เพียงพิมพ์เครื่องหมายคาเร็ต "^" และ M)


9

dos2unix สามารถแก้ไขเนื้อหาไฟล์ได้โดยตรง

คุณสามารถใช้งานได้โดยตรงบนไฟล์โดยไม่จำเป็นต้องเปลี่ยนเส้นทางไฟล์ชั่วคราว

dos2unix input.txt input.txt

ด้านบนใช้คีย์บอร์ด US ที่สมมติขึ้น ใช้-ตัวเลือก 437 เพื่อใช้แป้นพิมพ์ UK

dos2unix -437 input.txt input.txt


6

ขั้นตอนต่อไปนี้สามารถแปลงรูปแบบไฟล์สำหรับ dos เป็น unix:

:e ++ff=dos  Edit file again, using dos file format ('fileformats' is ignored).[A 1]
:setlocal ff=unix    This buffer will use LF-only line endings when written.[A 2]
:w   Write buffer using unix (LF-only) line endings.

การอ้างอิง: http://vim.wikia.com/wiki/Change_end-of-line_format_for_dos-mac-unix


6

ด้วยคำสั่งดังต่อไปนี้:

:%s/^M$//g 

รับ^Mที่จะปรากฏประเภทแล้ว CtrlV บอกให้ Vim นำตัวอักษรถัดไปที่ป้อนเข้ามาCtrlMCtrlV


6

ความคิดเห็นเกี่ยวกับการทำให้ ^ M ปรากฏเป็นสิ่งที่ใช้ได้ผลสำหรับฉัน เพียงพิมพ์ "^ M" ใน vi ของฉันไม่มีอะไรเลย (ไม่พบ) CTRL+ V CTRL+ Mลำดับได้อย่างสมบูรณ์แม้ว่า

คำสั่งทดแทนการทำงานของฉันคือ

:%s/Ctrl-V Ctrl-M/\r/g

และดูเหมือนว่าสิ่งนี้บนหน้าจอของฉัน:

:%s/^M/\r/g

4
คุณสามารถใช้แทน:%s เป็นชวเลข :1,$s%1,$
คนดีบุก

5

ฉันพบวิธีที่ง่ายมาก: เปิดไฟล์ด้วย nano: nano file.txt

กดCTRL+ Oเพื่อบันทึก แต่ก่อนที่จะกดEnterให้กด: ALT+ Dเพื่อสลับระหว่างปลายสาย DOS และ Unix / Linux หรือ: ALT+ Mเพื่อสลับระหว่างปลายสาย Mac และ Unix / Linux จากนั้นกดEnterเพื่อบันทึกและCTRL+ Xเพื่อออกจาก


ทำสิ่งนี้บนเซิร์ฟเวอร์ linux ไฟล์^Mจบแล้ว บันทึกเป็น dos เพื่อเก็บบันทึกเป็น linux เพื่อลบ สามารถตรวจสอบการใช้cat -v
HattrickNZ

คำถามนี้เกี่ยวกับเสียงเรียกเข้าไม่ใช่นาโน
Birchmeier

5
:g/Ctrl-v Ctrl-m/s///

CtrlMคืออักขระ\rหรือการขึ้นบรรทัดใหม่ซึ่งจบบรรทัดของ DOS เพิ่ม CtrlVบอกให้เป็นกลุ่มเพื่อแทรกตัวCtrlMอักษรที่บรรทัดคำสั่ง

โดยรวมแล้วคำสั่งนี้จะแทนที่ทั้งหมด\rโดยไม่มีอะไรเลยลบออกจากปลายบรรทัด



3

คุณสามารถใช้คำสั่งต่อไปนี้:
:%s/^V^M//g
'^' หมายถึงการใช้CTRLคีย์


2

คำสั่งด้านล่างใช้สำหรับฟอร์แมตไฟล์. sh ทั้งหมดในไดเรกทอรีปัจจุบันฉันทดสอบกับ Fedora OS

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done

2

ในกลุ่มให้พิมพ์:

:w !dos2unix %

สิ่งนี้จะไพพ์เนื้อหาของบัฟเฟอร์ปัจจุบันของคุณไปยังคำสั่ง dos2unix และเขียนผลลัพธ์ผ่านเนื้อหาปัจจุบัน กลุ่มจะขอให้โหลดไฟล์ใหม่หลังจากนั้น



1

โดยปกติจะมีdos2unixคำสั่งที่คุณสามารถใช้สำหรับเรื่องนี้เพียงให้แน่ใจว่าคุณอ่านคู่มือในขณะที่รุ่น GNU และ BSD แตกต่างกันเกี่ยวกับวิธีที่พวกเขาจัดการกับข้อโต้แย้ง

รุ่น BSD:

dos2unix $FILENAME $FILENAME_OUT
mv $FILENAME_OUT $FILENAME

รุ่น GNU:

dos2unix $FILENAME

หรือคุณสามารถสร้างของคุณเองdos2unixด้วยคำตอบที่เสนอใด ๆ ที่นี่ตัวอย่างเช่น:

function dos2unix(){
    [ "${!}" ] && [ -f "{$1}" ] || return 1;

    { echo ':set ff=unix';
      echo ':wq';
    } | vim "${1}";
}

1

ฉันรู้ว่าฉันเห็นสิ่งนี้ที่ไหนสักแห่ง นี่คือเคล็ดลับการเข้าสู่ระบบ FreeBSD:

ต้องการลบอักขระ ^ M ทั้งหมดจากไฟล์ DOS หรือไม่ ลอง

tr -d \\r < dosfile > newfile
    -- Originally by Dru <genesis@istar.ca>

0

แม้ว่าหัวข้อนี้จะเก่ามาก แต่ฉันต้องการนำสิ่งอื่นจากวิกิ:

%s/\r\+$//g

ที่เติมค้นหาสัญญาณการขึ้นบรรทัดใหม่ทั้งหมด (หนึ่งครั้งขึ้นไป) จนจบบรรทัดและลบดังนั้น\nจะอยู่ที่ eol


0

นี่คือวิธีของฉัน ฉันเปิดไฟล์ใน dos EOL และเมื่อฉันบันทึกไฟล์ที่จะแปลงเป็นยูนิกซ์ EOL โดยอัตโนมัติ

autocmd BufWrite * :set ff=unix

0

หากคุณสร้างไฟล์ใน NotePad หรือ NotePad ++ ใน windows และนำไปที่ Linux และเปิดโดย vim คุณจะเห็น ^ M ที่ท้ายบรรทัดแต่ละบรรทัด หากต้องการลบสิ่งนี้

ที่ terminal Linux ของคุณพิมพ์

ชื่อไฟล์ dos2unix.ext

สิ่งนี้จะทำเวทย์มนตร์ที่จำเป็น


0

ฉันต้องการบรรทัดใหม่แทน ^ M's Perl เพื่อช่วยเหลือ:

perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt

หรือเขียนถึง stdout:

perl -p -e 's/\x0d/\n/g' < excel_created.txt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.