เมื่อฉันเรียกใช้สคริปต์ SQL เฉพาะในสภาพแวดล้อม Unix ฉันเห็นอักขระ '^ M' ที่ท้ายแต่ละบรรทัดของสคริปต์ SQL เนื่องจากมีการสะท้อนกับบรรทัดคำสั่ง ฉันไม่ทราบว่าสคริปต์ SQL ถูกสร้างขึ้นในระบบปฏิบัติการใด
สาเหตุนี้เกิดจากอะไรและจะแก้ไขได้อย่างไร
เมื่อฉันเรียกใช้สคริปต์ SQL เฉพาะในสภาพแวดล้อม Unix ฉันเห็นอักขระ '^ M' ที่ท้ายแต่ละบรรทัดของสคริปต์ SQL เนื่องจากมีการสะท้อนกับบรรทัดคำสั่ง ฉันไม่ทราบว่าสคริปต์ SQL ถูกสร้างขึ้นในระบบปฏิบัติการใด
สาเหตุนี้เกิดจากอะไรและจะแก้ไขได้อย่างไร
คำตอบ:
มันเกิดจากอักขระลงท้ายบรรทัด DOS / Windows เช่นเดียวกับที่ Andy Whitfield กล่าวไว้คำสั่ง Unix dos2unix จะช่วยแก้ไขปัญหาได้ หากคุณต้องการข้อมูลเพิ่มเติมคุณสามารถอ่าน man pages สำหรับคำสั่งนั้น
brew install dos2unix
เมื่อคุณติดตั้ง homebrew
สาเหตุคือความแตกต่างระหว่างวิธีการที่ระบบปฏิบัติการที่ใช้ Windows และระบบปฏิบัติการที่ใช้ระบบปฏิบัติการ Unix จัดเก็บเครื่องหมายสิ้นสุดบรรทัด
ระบบปฏิบัติการที่ใช้ Windows ต้องขอบคุณ DOS ที่สืบทอดกันมาจึงจัดเก็บ end-of-line เป็นคู่ของอักขระ - 0x0D0A
(carriage return + line feed) ระบบปฏิบัติการที่ใช้ Unix เพียงแค่ใช้0x0A
( ฟีดบรรทัด ) สิ่งที่^M
คุณเห็นคือการแสดงภาพของ0x0D
(การกลับรถ )
dos2unixจะช่วยในเรื่องนี้ คุณอาจต้องปรับที่มาของสคริปต์ให้เป็น 'Unix-friendly'
^M
? ทำไมต้อง '^'? ทำไมต้องเป็น 'M'
vi
วิธีที่ง่ายที่สุดคือการใช้งาน ฉันรู้ว่ามันฟังดูแย่ แต่เรียบง่ายและติดตั้งในสภาพแวดล้อม UNIX ส่วนใหญ่แล้ว ^ M เป็นบรรทัดใหม่จากสภาพแวดล้อม Windows / DOS
จากพรอมต์คำสั่ง: $ vi filename
จากนั้นกด " :
" เพื่อเข้าสู่โหมดคำสั่ง
ค้นหาและแทนที่ทั้งหมดทั่วโลกคือ:%s/^M//g
" กดปุ่มควบคุมค้างไว้แล้วกด V แล้วกด M " ซึ่งจะแทนที่ ^ M โดยไม่มีอะไรเลย
จากนั้นจึงจะเขียนและออกจากป้อน " :wq
" เสร็จสิ้น!
ลองใช้ dos2unix เพื่อดึง ^ M ออก
ใน vi ให้ทำก :%s/^M//g
เพื่อให้ได้^M
ถือCTRLกุญแจกดVแล้วM(ทั้งในขณะที่ถือปุ่มควบคุม) และ^M
จะปรากฏ สิ่งนี้จะพบเหตุการณ์ทั้งหมดและแทนที่ด้วยอะไร
:%s/^M/\r/g
สคริปต์ SQL ถูกสร้างขึ้นในระบบปฏิบัติการ Windows อักขระ '^ M' เป็นผลมาจาก Windows และ Unix มีแนวคิดที่แตกต่างกันเกี่ยวกับสิ่งที่จะใช้สำหรับอักขระท้ายบรรทัด คุณสามารถใช้ perl ที่บรรทัดคำสั่งเพื่อแก้ไขปัญหานี้
perl -pie 's/\r//g' filename.txt
โดยทั่วไป ^ M เกิดจากบรรทัดใหม่ของตัวดำเนินการ Windows และแปลเป็น Unix จะมีลักษณะเป็น ^ M คำสั่ง dos2unix ควรลบออกอย่างดี
dos2unix [ตัวเลือก] [-c convmode] [-o ไฟล์ ... ] [-n infile outfile ... ]
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.
ในการแทนที่อักขระ ^ 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)
อีกทางเลือกหนึ่งสำหรับdos2unix
คำสั่งคือการใช้ยูทิลิตี้มาตรฐานเช่นsed
.
ตัวอย่างเช่น dos to unix:
sed 's/\r$//' dos.txt > unix.txt
unix สิ่งที่ต้องทำ:
sed 's/$/\r/' unix.txt > dos.txt
คุณสามารถลบ ^ M ออกจากไฟล์ได้โดยตรงผ่านคำสั่ง sed เช่น:
sed -i'.bak' s/\r//g *.*
หากคุณพอใจกับการเปลี่ยนแปลงให้ลบไฟล์. Bak:
rm -v *.bak
แปลง DOS / Windows (\ r \ n) ส่วนท้ายบรรทัดเป็น Unix (\ n) บรรทัดท้ายด้วย tr:
tr '\r\n' '\n' < dosFile.txt > unixFile.txt
od -a $file
มีประโยชน์ในการสำรวจคำถามประเภทนั้นบน Linux (คล้ายกับ dumphex ในข้างต้น)
ใน Perl หากคุณไม่ต้องการตั้งค่า $ / ตัวแปรและใช้ chomp () คุณสามารถทำได้:
$var =~ /\r\n//g;
สองเซ็นต์ของฉัน
คำสั่ง vi อื่นที่จะทำ: :%s/.$//
สิ่งนี้จะลบอักขระสุดท้ายของแต่ละบรรทัดในไฟล์ ข้อเสียเปรียบของคำสั่งค้นหาและแทนที่นี้คือมันไม่สนใจว่าอักขระสุดท้ายคืออะไรดังนั้นระวังอย่าเรียกมันซ้ำสอง