อักขระ ^ M หมายถึงอะไรใน Vim


500

ฉันได้รับ^Mตัวละครใน vimrc ของฉันและมันทำลายการกำหนดค่าของฉัน


35
BTW นี้เป็นทรัพยากรที่ดี
Lightness Races ในวงโคจร

@LightnessRacesinOrbit - หืมมันก็ทำงานได้เหมือนกัน ฉันถอนความคิดเห็นของฉันแล้วโดยบอกว่าลิงก์นั้นตายไปแล้ว
ArtOfWarfare

3
Mirror สำหรับลิงก์ @LightnessRacesinOrbit ซึ่งหยุดทำงานในขณะนี้: fifi.org/doc/vim/html/digraph.html#digraph-table
alexpls

4
การพิมพ์:digraphsภายในกลุ่มจะแสดงตาราง digraph ที่ @LightnessRacesinOrbit เชื่อมโยงกับ
askewchan

1
เมื่อพยายามแทนที่ตัวละครประเภทนี้โดยใช้ php ลองใช้ preg_replace('/[\x01]/', ' ' ,$str); Hope หวังว่าจะช่วยได้
Rachel Geller

คำตอบ:


561

Unix ใช้ 0xA สำหรับอักขระขึ้นบรรทัดใหม่ Windows ใช้การรวมกันของอักขระสองตัว: 0xD 0xA 0xD เป็นอักขระการคืนสินค้า ^Mเป็นวิธีที่ vim แสดง 0xD (0x0D = 13, M คือตัวอักษรที่ 13 ในตัวอักษรภาษาอังกฤษ)

คุณสามารถลบ^Mตัวละครทั้งหมดโดยการเรียกใช้สิ่งต่อไปนี้:

:%s/^M//g

ไหน^Mจะถูกป้อนโดยถือลงCtrlและการพิมพ์vตามด้วยแล้วปล่อยm Ctrlบางครั้งก็เป็นตัวย่อว่า^V^Mแต่โปรดทราบว่าคุณต้องป้อนตามที่อธิบายไว้ในประโยคก่อนหน้าแทนที่จะพิมพ์ออกมาอย่างแท้จริง

นิพจน์นี้จะแทนที่การเกิดขึ้นทั้งหมด^Mด้วยสตริงว่าง (คือไม่มีอะไร) ฉันใช้สิ่งนี้เพื่อกำจัด^Mไฟล์ที่คัดลอกจาก Windows เป็น Unix (Solaris, Linux, OSX)


9
ในกรณีที่คุณใช้ Windows Ctrl + V อาจถูกแมปเพื่อวาง หากเป็นกรณีนี้ค่าเริ่มต้นจะทำการแมปปุ่ม "การเว้นอักขระพิเศษ" เพื่อกด Ctrl + Q
R. Martinho Fernandes

8
คำถามที่แท้จริงคือทำไมบางครั้งกลุ่มตรวจจับการสิ้นสุดของบรรทัดและแสดงอย่างถูกต้องโดยอัตโนมัติและบางครั้งก็ไม่
Scott

10
คุณจะเห็น^Mอักขระถ้าไฟล์นั้นมีจุดสิ้นสุดของบรรทัดที่ไม่ตรงกัน ใช้คำสั่งจาก Tomasz จากนั้นพิมพ์:fileformat={unix|dos|mac}ตามระบบปฏิบัติการที่คุณกำหนดเป้าหมาย หากมีเพียงไม่กี่บรรทัดโดยไม่มีตัวละครที่คุณอาจต้องการ^M :fileformat=dosหากคุณกำลังแก้ไขไฟล์ในโปรแกรมแก้ไขอื่นนอกเหนือจาก vim ต้องแน่ใจว่ามันได้รับการกำหนดค่าให้ตรงกับจุดสิ้นสุดของบรรทัด (Notepad จะไม่ทำสิ่งนี้ แต่เครื่องมือแก้ไขที่มีชื่อเสียงเช่น Notepad ++ หรือ TextMate จะ)
Mikkel Paulson

9
หมายเหตุสำหรับผู้เริ่มต้นถึงviคำสั่งนั้นจะต้องพิมพ์ด้วยตนเอง เพียงแค่วางลงในเทอร์มินัลเปิดที่มีการviทำงานอยู่จะทำให้เกิดข้อผิดพลาด "ไม่พบรูปแบบ"
IQAndreas

51
@bluesm ฉันต้องใช้จริง ๆ:%s/\r//gเพื่อแทนที่ carriage return ในไฟล์ของฉัน ไม่พบรูปแบบ ^ V ^ M ในไฟล์ที่ฉันมีอักขระ ^ M จำนวนมาก
jonnybot

139
:%s/\r//g 

ทำงานให้ฉันวันนี้ แต่สถานการณ์ของฉันอาจแตกต่างกันเล็กน้อย


1
ไม่จำเป็นต้องใช้ตัวเลือก g มีเพียงหนึ่งบรรทัดใหม่ต่อบรรทัด :%s/\r//จะพอเพียง
frogcoder

7
อาจจำเป็นต้องใช้ตัวเลือก g ได้เป็นอย่างดีเนื่องจากการขึ้นบรรทัดใหม่ไม่ใช่บรรทัดใหม่ เมื่อเปิดในโหมด Unix การขึ้นบรรทัดใหม่กลับเป็นเพียงอีกตัวอักษรหนึ่งและเมื่อเปิดในโหมด Windows การขึ้นบรรทัดใหม่จะเป็นแบบพิเศษตามด้วยฟีดบรรทัดทันที
Jonathan Baldwin

65

หากต้องการแปลบรรทัดใหม่แทนที่จะลบ:

:%s/\r/\r/g

2
สิ่งนี้จริง ๆ แล้วควรทำอย่างไร สำหรับฉันดูเหมือนว่ากำลังทำการทดแทนสิ่งที่ชอบซึ่งไม่สามารถจินตนาการได้ว่าจะเปลี่ยนแปลงอะไร ฉันไม่มีอะไรพิเศษเกี่ยวกับการทำงานของไวยากรณ์ที่นี่หรือไม่
Platinum Azure

16
@ PlatinumAzure ฉันไม่รู้ว่าทำไมไม่มีใครคิดที่จะตอบคำถามของคุณ \rมีพฤติกรรมที่แตกต่างกันในส่วนการค้นหากับส่วนแทนที่ ดูstackoverflow.com/a/3834303เป็นตัวอย่าง

หรือ :%s/^V^M/^V^M/g ดูที่นี่
59

@TomD ลิงก์นี้อ้างถึงคำตอบที่คุณแสดงความคิดเห็น
bzeaman

สำหรับฉันนี้แทนที่ตัวละครที่น่ารำคาญด้วยการขึ้นบรรทัดใหม่ @ dlk5730 คำตอบทำงานได้ดีขึ้นสำหรับฉัน ie:%s/\r//g
marcusshep

37

อาจหมายความว่าคุณได้รับคืนตลับหมึก (ระบบปฏิบัติการที่แตกต่างกันใช้วิธีการส่งสัญญาณในตอนท้ายที่ต่างกัน)

ใช้dos2unixเพื่อแก้ไขไฟล์หรือตั้งค่ารูปแบบไฟล์เป็นกลุ่ม:

set ffs=unix,dos

19

สมมติว่าไฟล์ข้อความของคุณคือ - file.txt จากนั้นเรียกใช้คำสั่งนี้ -

dos2unix file.txt 

มันจะแปลงไฟล์ข้อความจาก dos เป็นรูปแบบ unix


ทำงานได้อย่างสมบูรณ์แบบ!
robe007

9

ฉันได้รับไฟล์ข้อความที่สร้างขึ้นบนเครื่อง Windows โดยผู้ใช้ Mac และต้องการนำเข้าสู่ Linux MySQL DB โดยใช้load dataคำสั่ง

ถึงแม้ว่า VIM จะแสดงตัวอักษร '^ M' แต่ก็ไม่ได้ผลใด ๆ สำหรับปัญหาเฉพาะของฉัน แต่ข้อมูลจะนำเข้า แต่ก็เสียหายเสมอในบางวิธี วิธีการแก้ปัญหาก็ค่อนข้างง่ายในที่สุด (หลังจากแห้วมาก)

การแก้ไข: การดำเนินการdos2unix สองครั้งในไฟล์เดียวกันนั้นเป็นการหลอกลวง! การใช้fileคำสั่งแสดงสิ่งที่เกิดขึ้นระหว่างทาง

$ file 'file.txt'
file.txt: ASCII text, with CRLF, CR line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text, with CRLF line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text

และเวอร์ชันสุดท้ายของไฟล์นำเข้าอย่างสมบูรณ์ในฐานข้อมูล



9

ฉันลบทั้งหมดด้วย sed:

sed -i -e 's/\r//g' <filename>

สามารถแทนที่ด้วยสตริงหรืออักขระอื่น:

sed -i -e 's/\r/string/g' <filename>

sedคำสั่งเหล่านั้นใช้ได้กับ GNU / Linux sedแต่อาจต้องปรับแต่ง BSD (รวมถึง macOS)


4

คุณสามารถแก้ไขปัญหานี้ในกลุ่มโดยใช้

:1,$s/^V^M//g

โดยที่ ^ คืออักขระควบคุม


2
นี่ไม่ได้อธิบายว่าอะไร^Mคือสิ่งที่
Lightness Races ในวงโคจร

2
เขาไม่ได้ถามว่ามันคืออะไรเขาถามว่าจะแก้ไขอย่างไร สิ่งที่เป็นตัวละครกลับรถจาก DOS
Scott C Wilson

3
ฉันรู้ว่ามันคืออะไร หัวข้อของคำถามคือ "อักขระ ^ M หมายถึงอะไรใน Vim"
Lightness Races ในวงโคจร


2

หากแบ่งการกำหนดค่าของคุณและจำเป็นต้องใช้อักขระ ^ M ในการแมปคุณสามารถแทนที่อักขระ ^ M ด้วย<Enter>หรือแม้กระทั่ง<C-m>(ทั้งสองพิมพ์เป็นลำดับอักขระอย่างง่ายดังนั้นอักขระ 7 และ 5 ตามลำดับ)

นี่เป็นวิธีเดียวที่แนะนำและพกพาได้ในการจัดเก็บคีย์โค้ดพิเศษในการแมป



1

หากคุณไม่ได้ระบุfileformatเจตนาอื่น (เช่น:e ++ff=unixสำหรับไฟล์ Windows) อาจเป็นไปได้ว่าไฟล์เป้าหมายมี EOL ผสม

ตัวอย่างเช่นหากไฟล์มีบางบรรทัดที่มี<CR><NL>ตอนจบและอื่น ๆ ที่มี <NL>ตอนจบและfileformatตั้งเป็นunixVim โดยอัตโนมัติเมื่ออ่านมัน^M (<CR>)จะปรากฏขึ้น ในกรณีดังกล่าวfileformatsเข้ามาเล่น ดู:help ffsรายละเอียดที่


0

ฉันได้ค้นพบว่าฉันได้สร้างมลพิษให้กับไฟล์เป็นเวลาหลายสัปดาห์เนื่องจากอินสแตนซ์ Homebrew Mvim ของฉันถูกตั้งค่าให้ใช้ filetype = dos ทำการเปลี่ยนแปลงที่จำเป็นใน. vimrc ....


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