`^ M` คืออะไรและฉันจะกำจัดมันได้อย่างไร


134

เมื่อฉันเปิดไฟล์vimฉันเห็น^Mตัวละครแปลก ๆ

น่าเสียดายที่เสิร์ชเอนจิ้นที่ชื่นชอบในโลกไม่สามารถใช้อักขระพิเศษในการค้นหาได้ดีดังนั้นฉันจึงถามที่นี่:

  • ^Mตัวละครนี้คืออะไร?

  • มันจะไปได้อย่างไรที่นั่น?

  • ฉันจะกำจัดมันได้อย่างไร


3
Vlastimil นั่นเป็นการแก้ไขที่ไม่มีจุดหมาย Got เป็นกาลที่ผ่านมาที่เหมาะสมในการได้รับในภาษาอังกฤษแบบอังกฤษ
Jesse_b

1
help digraph-tableมันเป็นความควบคุมเดี่ยวตัวอักษรสำหรับข้อมูลเพิ่มเติม:
Eric Leschinski

คำตอบ:


107

นี่^Mคืออักขระ carriage-return หากคุณเห็นสิ่งนี้คุณอาจกำลังดูไฟล์ที่มาจากโลก DOS / Windows ที่จุดสิ้นสุดของบรรทัดถูกทำเครื่องหมายโดยคู่ carriage return / newline คู่ในโลก Unix ซึ่งเป็น end-of-line ถูกทำเครื่องหมายด้วยบรรทัดใหม่เดียว

อ่านบทความนี้เพื่อดูรายละเอียดมากขึ้นและยังรายการวิกิพีเดียสำหรับการขึ้นบรรทัดใหม่

บทความนี้อธิบายถึงวิธีการตั้งค่า vim เพื่อแก้ไขไฟล์ที่มีเครื่องหมายสิ้นสุดบรรทัดที่แตกต่างกัน

หากคุณมีไฟล์^Mที่ส่วนท้ายของบางบรรทัดและคุณต้องการกำจัดมันให้ใช้สิ่งนี้ใน Vim:

:s/^M$//

(กดCtrl+ V Ctrl+ Mเพื่อแทรก^M)


11
ลอง:%s/^M/\r/gแทนเพื่อลบ^Mและแทนที่ด้วยตัวอักษรขึ้นบรรทัดใหม่^M \rหากไม่มี%คำสั่งจะใช้กับบรรทัดปัจจุบันเท่านั้น และฉันเจอตัวอย่างที่^Mไม่มีจุดสิ้นสุดเช่นThe first line.^MThe second line.
George

หรือถ้าคุณไม่ต้องการโหลดของเส้นแบ่งคุณก็สามารถทำ:%s/^M/
carefulnow1

2
หากเป็นเพียงการคืนรถด้วยตัวเองนั่นอาจเป็นตัวแบ่งบรรทัด Macintosh แบบคลาสสิก (pre-Unix) แม้แต่บางโปรแกรมที่ใหม่กว่าเช่น Excel 2007 สำหรับ Mac ก็ทำได้ด้วยเหตุผลบางประการ
sudo

@larsks But altap.cz/salamander/help/salamand/appendix_txtfilesบอกว่า^Mใช้ใน UNIX
Vivek

บทความที่คุณเชื่อมโยงบอกว่า\nใช้ใน Unix ซึ่งถูกต้อง นั่นคือรหัส ASCII หรือที่เรียกว่า10 ^J
larsks

39

ระบบปฏิบัติการ UNIX ส่วนใหญ่มียูทิลิตีที่เรียกdos2unixว่าจะแปลง CRLF เป็น LF คำตอบอื่น ๆ ครอบคลุมคำถาม "พวกเขาคืออะไร"


36

วิธีที่ง่ายกว่าในการทำเช่นนี้คือใช้คำสั่งต่อไปนี้:

dos2unix filename

คำสั่งนี้ใช้ได้กับรูปแบบพา ธ เช่นกัน

dos2unix path/name*

หากไม่ได้ผลให้ลองใช้โหมดอื่น:

dos2unix -c mac filename
  • -cตั้งค่าโหมดการแปลง โดยที่ CONVMODE เป็นหนึ่งใน: ascii, 7bit, iso, macโดยasciiเป็นค่าเริ่มต้น

22

สิ่งนี้ใช้ได้สำหรับฉัน

:e ++ff=dos 

คำสั่ง: e ++ ff = dos บอกให้ Vim อ่านไฟล์อีกครั้งบังคับให้ฟอร์แมตไฟล์ dos Vim จะลบ CRLF และ LF-end endings ออกจากข้อความของแต่ละบรรทัดในบัฟเฟอร์

แล้วก็

:set ff=unix 

และในที่สุดก็

:wq 

3
ขอบคุณ! สิ่งนี้ใช้ได้สำหรับฉัน แต่วิธีแก้ปัญหาที่ยอมรับไม่ได้
Bjorks หมายเลขหนึ่งแฟน

ไม่ffหมายถึงรูปแบบไฟล์? เกี่ยวกับ++ffอะไร
KcFnMi

คำสั่ง: e ++ ff = dos บอกให้ Vim อ่านไฟล์อีกครั้งบังคับให้ฟอร์แมตไฟล์ dos Vim จะลบ CRLF และ LF-end endings ออกจากข้อความของแต่ละบรรทัดในบัฟเฟอร์
สไตรเกอร์

10

อีกวิธีในการกำจัด carriage return คือการใช้trคำสั่ง

ฉันมีสคริปต์ขนาดเล็กที่มีลักษณะเช่นนี้

#!/bin/sh
tmpfile=$(mktemp)
tr -d '\r' <"$1" >"$tmpfile"
mv "$tmpfile" "$1"

6

คุณสามารถทำความสะอาดสิ่งนี้ด้วยsed:

sed -e 's/^M$//' < infile > outfile

เคล็ดลับคือวิธีการป้อนคืนรถอย่างถูกต้อง โดยทั่วไปคุณต้องพิมพ์C-v C-mเพื่อป้อนการรับคืนตามตัวอักษร นอกจากนี้คุณยังสามารถทำงานในสถานที่ที่มี

sed -i.bak -e 's/^M$//' infile

2

^ M คืออะไร
^ M เป็นอักขระปัดแคร่ หากคุณเห็นสิ่งนี้คุณอาจกำลังดูไฟล์ที่มาจากโลก DOS / Windows ที่จุดสิ้นสุดของบรรทัดถูกทำเครื่องหมายโดยคู่ carriage return / newline คู่ในโลก Unix ซึ่งเป็น end-of-line ถูกทำเครื่องหมายด้วยบรรทัดใหม่เดียว

มันเป็นไปได้อย่างไร
เมื่อมีการเปลี่ยนแปลงในรูปแบบไฟล์

ฉันจะกำจัดมันได้อย่างไร
เปิดไฟล์ของคุณด้วย

vim -b FILE_PATH

บันทึกด้วยคำสั่งดังต่อไปนี้

:%s/^M//g

คุณได้มีการพิมพ์ผิดในเปิด filr ของคุณด้วย
Mateusz Piotrowski

4
คำตอบนี้จะไม่เพิ่มอะไรให้กับคำตอบอื่น ๆ ย่อหน้าแรกเป็นสำเนาเกือบทุกคำจากคำตอบที่ยอมรับ รหัสที่กำหนดจะไม่บันทึกอะไรเลยเพียง แต่ลบอักขระการคืนสินค้าทั้งหมดออกจากทุกบรรทัด และฉันไม่แน่ใจว่าการเปิดไฟล์ในโหมดไบนารีจะช่วยได้อย่างไร
Dubu

2

ในกรณีของฉัน

ไม่มีอะไรข้างต้นทำงานฉันมีไฟล์ CSV คัดลอกไปยังเครื่อง Linux จาก mac ของฉันและฉันใช้คำสั่งทั้งหมดข้างต้น แต่ไม่มีอะไรช่วย แต่ด้านล่าง

tr "\015" "\n" < inputfile > outputfile

ฉันมีไฟล์ที่ตัวละคร ^ M ถูกขัดจังหวะระหว่างบรรทัดบางอย่างเช่นด้านล่าง

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,


0

เพิ่มบรรทัดต่อไปนี้ใน ~ / .vimrc ของคุณ

command! Tounix :call Preserve('1,$s/^M//')

จากนั้นเมื่อคุณมีไฟล์ที่มีจุดสิ้นสุดบรรทัด Windows ให้รันคำสั่ง ": Tounix"


-1

ในอดีตฉันเคยเห็นไฟล์การกำหนดค่าแม้จะไม่ได้รับการวิเคราะห์อย่างถูกต้องและบ่นเกี่ยวกับช่องว่าง แต่ถ้าคุณ vi และทำรายการชุดมันจะไม่แสดงช่องว่าง grep ชื่อไฟล์ [[space]] จะแสดงให้คุณเห็น ^ M

นั่นคือเมื่อdos2unix fileช่วย


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