อักขระ '^ M' ที่ท้ายบรรทัด


99

เมื่อฉันเรียกใช้สคริปต์ SQL เฉพาะในสภาพแวดล้อม Unix ฉันเห็นอักขระ '^ M' ที่ท้ายแต่ละบรรทัดของสคริปต์ SQL เนื่องจากมีการสะท้อนกับบรรทัดคำสั่ง ฉันไม่ทราบว่าสคริปต์ SQL ถูกสร้างขึ้นในระบบปฏิบัติการใด

สาเหตุนี้เกิดจากอะไรและจะแก้ไขได้อย่างไร

คำตอบ:


79

มันเกิดจากอักขระลงท้ายบรรทัด DOS / Windows เช่นเดียวกับที่ Andy Whitfield กล่าวไว้คำสั่ง Unix dos2unix จะช่วยแก้ไขปัญหาได้ หากคุณต้องการข้อมูลเพิ่มเติมคุณสามารถอ่าน man pages สำหรับคำสั่งนั้น


3
ในบางระบบ (เช่น Ubuntu) ชื่อของคำสั่งนี้คือ "fromdos"
bobwienholt

6
คุณสามารถรับเครื่องมือบน OSX ได้ง่ายมากbrew install dos2unixเมื่อคุณติดตั้ง homebrew
philipp

73

แก้ไขการสิ้นสุดบรรทัดviโดยเรียกใช้สิ่งต่อไปนี้:

:set fileformat=unix

:w


2
นี่คือคำตอบที่ยอดเยี่ยม ขอบคุณมาก. (บันทึกการติดตั้ง dos2unix เครื่องมือที่ฉันอาจใช้เพียงครั้งเดียว)
Jamsi

3
สิ่งนี้ไม่ได้ลบ^Ms ด้วยเหตุผลบางประการ ไฟล์อ้างอิง: /etc/timidity/fluidr3_gm.cfg.
phil294

39

สาเหตุคือความแตกต่างระหว่างวิธีการที่ระบบปฏิบัติการที่ใช้ Windows และระบบปฏิบัติการที่ใช้ระบบปฏิบัติการ Unix จัดเก็บเครื่องหมายสิ้นสุดบรรทัด

ระบบปฏิบัติการที่ใช้ Windows ต้องขอบคุณ DOS ที่สืบทอดกันมาจึงจัดเก็บ end-of-line เป็นคู่ของอักขระ - 0x0D0A (carriage return + line feed) ระบบปฏิบัติการที่ใช้ Unix เพียงแค่ใช้0x0A( ฟีดบรรทัด ) สิ่งที่^Mคุณเห็นคือการแสดงภาพของ0x0D(การกลับรถ )

dos2unixจะช่วยในเรื่องนี้ คุณอาจต้องปรับที่มาของสคริปต์ให้เป็น 'Unix-friendly'


ฉันจะไม่พูดรุ่นปัจจุบันของ Windows มีชนิดของ DOS ใดมรดก พวกเขายังคงมีข้อ จำกัด ด้านความเข้ากันได้
Joey

นี่เป็นวิธีง่ายๆคือคุณใช้เครื่องมือแปลงอัตโนมัติ Thank's
Pjl

แต่ทำไม^M? ทำไมต้อง '^'? ทำไมต้องเป็น 'M'
1737973

เพราะมันเป็น "ตัวควบคุม". "^" คือการแสดงภาพของการคลิกแป้นควบคุม ภายใต้ไบต์ที่เฉพาะเจาะจง ^ คือวิธีที่ตัวแก้ไขแสดงถึง
Hejazzman

24

viวิธีที่ง่ายที่สุดคือการใช้งาน ฉันรู้ว่ามันฟังดูแย่ แต่เรียบง่ายและติดตั้งในสภาพแวดล้อม UNIX ส่วนใหญ่แล้ว ^ M เป็นบรรทัดใหม่จากสภาพแวดล้อม Windows / DOS

จากพรอมต์คำสั่ง: $ vi filename

จากนั้นกด " :" เพื่อเข้าสู่โหมดคำสั่ง

ค้นหาและแทนที่ทั้งหมดทั่วโลกคือ:%s/^M//g" กดปุ่มควบคุมค้างไว้แล้วกด V แล้วกด M " ซึ่งจะแทนที่ ^ M โดยไม่มีอะไรเลย

จากนั้นจึงจะเขียนและออกจากป้อน " :wq" เสร็จสิ้น!


จะเปลี่ยนเป็น emacs ได้อย่างไร?
herbertD

ขอบคุณ! VI (M) เยี่ยมมาก!
IonicăBizău

3
ขอบคุณสำหรับคำอธิบายเกี่ยวกับวิธีการพิมพ์อักขระ ^ M! ฉันจะแทนที่ด้วย \ r แทน ดังนั้นฉันจึงทำ:% s / ^ M / \ r / g
aharris88


10

ใน vi ให้ทำก :%s/^M//g

เพื่อให้ได้^MถือCTRLกุญแจกดVแล้วM(ทั้งในขณะที่ถือปุ่มควบคุม) และ^Mจะปรากฏ สิ่งนี้จะพบเหตุการณ์ทั้งหมดและแทนที่ด้วยอะไร


2
ในการแทนที่ ^ M ด้วยการแบ่งบรรทัดแบบรวมมิตร::%s/^M/\r/g
Gary Oak

8

สคริปต์ SQL ถูกสร้างขึ้นในระบบปฏิบัติการ Windows อักขระ '^ M' เป็นผลมาจาก Windows และ Unix มีแนวคิดที่แตกต่างกันเกี่ยวกับสิ่งที่จะใช้สำหรับอักขระท้ายบรรทัด คุณสามารถใช้ perl ที่บรรทัดคำสั่งเพื่อแก้ไขปัญหานี้

perl -pie 's/\r//g' filename.txt

แน่นอนคุณสามารถใช้ perl ได้ แต่คุณจะแนะนำ perl มากกว่า dos2unix หรือไม่?
Thomas Owens

2
ฉันแค่ให้ทางเลือกเนื่องจากมีคน 4 คนบอกว่าจะใช้ dos2unix แล้ว
Bill the Lizard

2
ใช่ฉันพบว่าสิ่งนี้มีประโยชน์เพราะฉันอยู่บนเวิร์กสเตชันที่ล้าหลังซึ่งทำงานในสำนักงานที่มีแผนกไอทียุคก่อนประวัติศาสตร์ ยกเว้นฉันใช้รูปแบบ: perl -pi -e "s / \ x0D / \ n / g" file.csv
Rimian

7

โดยทั่วไป ^ M เกิดจากบรรทัดใหม่ของตัวดำเนินการ Windows และแปลเป็น Unix จะมีลักษณะเป็น ^ M คำสั่ง dos2unix ควรลบออกอย่างดี

dos2unix [ตัวเลือก] [-c convmode] [-o ไฟล์ ... ] [-n infile outfile ... ]


5
C:\tmp\text>dos2unix hello.txt helloUNIX.txt

Sed มีให้ใช้งานอย่างแพร่หลายมากขึ้นและสามารถทำสิ่งนี้ได้เช่นกันหากไม่ได้ติดตั้ง dos2unix

C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt  

คุณยังสามารถลอง tr:

cat hello.txt | tr -d \r > helloUNIX2.txt  

นี่คือผลลัพธ์:

C:\tmp\text>dumphex hello.txt  
00000000h: 48 61 68 61 0D 0A 68 61 68 61 0D 0A 68 61 68 61 Haha..haha..haha  
00000010h: 0D 0A 0D 0A 68 61 68 61 0D 0A                   ....haha..  

C:\tmp\text>dumphex helloUNIX.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  

C:\tmp\text>dumphex helloUNIX2.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  

4

ในการแทนที่อักขระ ^ M ในตัวแก้ไข vi ให้ใช้ด้านล่าง

เปิดไฟล์ข้อความพูดว่า t1.txt

vi t1.txt

เข้าสู่โหมดคำสั่งโดยการกด shift + :

จากนั้นกดปุ่มตามที่กล่าวไว้ %s/^M/\r/g

in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)

บรรทัดสุดท้ายของคุณคือสิ่งที่ฉันขาดหายไปจากคำตอบก่อนหน้านี้ทั้งหมด ฉันยังคงได้รับ 'ไม่พบการจับคู่ bc ฉันทำ shift + 6 ดังนั้นฉันจึงทำในสิ่งที่แฮ็กเกอร์ทุกคนทำและหลีกเลี่ยงความเข้าใจผิดของฉันด้วยวิธีแก้ปัญหาของฉันเอง: บันทึกมาโครเพื่อทำ $ เพื่อไปที่จุดสิ้นสุดของแต่ละบรรทัดจากนั้นกด x เพียง ทำซ้ำมาโครสำหรับจำนวนบรรทัดในไฟล์
Darethas

3

อีกทางเลือกหนึ่งสำหรับdos2unixคำสั่งคือการใช้ยูทิลิตี้มาตรฐานเช่นsed .

ตัวอย่างเช่น dos to unix:

sed 's/\r$//' dos.txt > unix.txt

unix สิ่งที่ต้องทำ:

sed 's/$/\r/' unix.txt > dos.txt

1

คุณสามารถลบ ^ M ออกจากไฟล์ได้โดยตรงผ่านคำสั่ง sed เช่น:

sed -i'.bak' s/\r//g *.*

หากคุณพอใจกับการเปลี่ยนแปลงให้ลบไฟล์. Bak:

rm -v *.bak



0

ใน Perl หากคุณไม่ต้องการตั้งค่า $ / ตัวแปรและใช้ chomp () คุณสามารถทำได้:

$var =~ /\r\n//g;

สองเซ็นต์ของฉัน


-1

คำสั่ง vi อื่นที่จะทำ: :%s/.$// สิ่งนี้จะลบอักขระสุดท้ายของแต่ละบรรทัดในไฟล์ ข้อเสียเปรียบของคำสั่งค้นหาและแทนที่นี้คือมันไม่สนใจว่าอักขระสุดท้ายคืออะไรดังนั้นระวังอย่าเรียกมันซ้ำสอง


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