^ M ที่ท้ายทุกบรรทัดเป็นกลุ่ม


133

เมื่อฉันแก้ไขไฟล์ต้นฉบับโดยใช้ vim และตัวแก้ไขอื่น ๆ บางครั้งที่ท้ายบรรทัดฉันจะได้รับอักขระ ^ M เหล่านี้ที่ท้ายแต่ละบรรทัด ฉันคิดว่ามันเกี่ยวข้องกับการแก้ไขไฟล์ใน windows แล้วใน linux ฉันจะลบสิ่งเหล่านี้ทั้งหมดโดยอัตโนมัติได้อย่างไร


18
เป็นเพราะ Windows ใช้ลำดับอักขระสองตัว (ปกติเขียนว่า "\ r \ n") เพื่อแสดงการแบ่งบรรทัด แต่ UNIX / Linux ใช้เพียงอักขระตัวที่สอง "\ n" เพื่อแสดงการแบ่งบรรทัด ดังนั้นเมื่อคุณแก้ไขไฟล์ข้อความ Windows บนตัวแก้ไข Linux ตัวแก้ไขจะเห็นอักขระพิเศษที่ไม่ถือว่าเป็นส่วนหนึ่งของตัวแบ่งบรรทัดดังนั้นจึงพยายามแสดงผลและสิ่งที่ออกมาคือ ^ M
David Z

13
มีอะไรมากกว่านั้นอีกเล็กน้อยเดวิด เป็นกลุ่มมีความสุขจะแก้ไขไฟล์ข้อความที่มี DOS ปลายสายโดยไม่ต้องแสดงทุกคน^Ms ข้อบ่งชี้เดียวที่คุณมีเมื่อแก้ไขไฟล์ข้อความ DOS ใน Vim คือถ้าคุณมีค่าตัวเลือก%{&ff}ของคุณ statuslineแสดงให้เห็นว่าเป็นกลุ่ม^Mเมื่อสายสิ้นสุดรูปแบบผสม หมายความว่าคุณใช้โปรแกรมแก้ไขข้อความที่ไม่เข้าใจเท่า Vim ซึ่งไม่ได้เป็นไปตามรูปแบบการสิ้นสุดบรรทัดที่มีอยู่เนื่องจาก Vim จะเป็นค่าเริ่มต้น หากคุณใช้ Vim หรืออย่างอื่นที่มีความสามารถใน Windows คุณจะไม่ได้รับจุดสิ้นสุดบรรทัดที่พังทลายเช่นนั้น
Warren Young

คำตอบ:


128

พิมพ์ตามคำสั่ง

:%s/^M$//

(หากต้องการรับ ^ M ให้กด ^ V ^ M โดยที่ ^ คือ CTRL บนแป้นพิมพ์ส่วนใหญ่)


66
ด้วย:% s / \ r $ // เพื่อหลีกเลี่ยงความยุ่งยาก ^ V ^ M
glenn jackman

8
หรือบันทึกอักขระ::%s/\r$
เห็น

2
@sehe บันทึก 2 ตัวอักษรในทางเทคนิค :)
Chris

@glennjackman เคล็ดลับของคุณนั้นง่ายกว่ามากเพราะฉันพยายามดิ้นรนเพื่อให้ได้ ^ V + ^ M มาตลอด แต่มันไม่ได้เกิดขึ้นเลย สิ่งที่ฉันได้รับคือเนื้อหาในคลิปบอร์ด (เนื่องจาก ^ V ได้ผลทุกครั้งแม้ว่าฉันจะพยายามหลายครั้งด้วยกลยุทธ์ที่แตกต่างกันเพื่อให้ได้ทั้งสองอย่าง)
itsraghz

87

วิธีง่ายๆอย่างหนึ่งในการตัดส่วนท้ายบรรทัด DOS ออกคือการใช้ffตัวเลือก:

:set ff=unix
:wq

ตอนนี้ไฟล์ของคุณกลับไปเป็น Unix-way ที่ดี

หากคุณต้องการเพิ่มส่วนท้ายบรรทัด DOS (เพื่อให้เครื่องพิมพ์มีความสุขหรือถ่ายโอนไฟล์กับเพื่อน Windows ที่ไม่มีเครื่องมือที่ดี) คุณสามารถไปในทิศทางตรงกันข้ามได้อย่างง่ายดาย:

:set ff=dos
:wq

8
ไม่พบกลุ่ม ^ m หรือ \ r หรือส่วนท้ายบรรทัดอื่น ๆ แต่ก็ใช้ได้ผล ขอบคุณ :)
SgtPooki

2
Vim จะไม่พบ ^ M หรือ \ r แต่มันใช้ได้ผลสำหรับฉัน! ขอบคุณ @sarnold
7ochem

ดูเหมือนว่าคอมไพล์จะโง่เกินไปที่จะตรวจพบว่าเป็นการเปลี่ยนแปลงอักขระเพียงตัวเดียว ฉันเรียกใช้สิ่งนี้ใน Vim และgit diffรายการทุกบรรทัดที่ถูกลบและทุกบรรทัดที่เพิ่ม: /
Tommy

ทอมมี่ว่าเป็นข้อ จำกัด เกี่ยวกับการไม่ได้อยู่ในdiff git
Spidey

34

คุณสามารถทำได้:

:set fileformats=dos

มันจะซ่อน^Mไฟล์โดยไม่ต้องสัมผัสไฟล์


17

มีโปรแกรมที่เรียกว่าdos2unixที่ควรตัดสิ่งเหล่านั้นให้คุณ Windows ใช้อักขระสิ้นสุดบรรทัดที่แตกต่างกันซึ่งเป็นสาเหตุที่เกิดขึ้น


6

สิ่งนี้ใช้ได้ผลกับฉันในไฟล์ที่มีทุกอย่างในบรรทัดเดียว:

ก่อนอื่นให้ค้นหารายการที่ตรงกันทั้งหมด

:%s/^M//

(ในการรับ^Mให้กด ^ V ^ M โดยที่ ^ อยู่Ctrlบนแป้นพิมพ์ส่วนใหญ่)

จากนั้นแทนที่ด้วยขึ้นบรรทัดใหม่

:%s//\r/g

คำสั่งรวมจะเป็น:

:%s/^M/\r/g

ขอบคุณสงสัยว่าจะป้อน Ctrl-M ในการค้นหาแทนที่ได้อย่างไร!
Roboprog


1

ต้นตอของปัญหาอาจเกิดจากการถ่ายโอน FTP เมื่อคุณ FTP ไฟล์เหล่านี้จากกล่องหนึ่งไปยังอีกกล่องหนึ่งตรวจสอบให้แน่ใจว่าได้ใช้การถ่ายโอน ASCII ใช้คำสั่ง "ASC"


0
" put this in your ~/.vimrc file and :source ~/.vimrc
" then you can do: Dos2Unix
" dos2unix ^M
fun! Dos2unixFunction()
    let _s=@/
    let l = line(".")
    let c = col(".")
    try
        set ff=unix
        w!
        "%s/\%x0d$//e
    catch /E32:/
        echo "Sorry, first save the file."
    endtry
    let @/=_s
    call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()

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