लाइनों के अंत में '^ M' वर्ण


99

जब मैं यूनिक्स वातावरण में एक विशेष एसक्यूएल स्क्रिप्ट चलाता हूं, तो मैं एसक्यूएल स्क्रिप्ट की प्रत्येक पंक्ति के अंत में एक '^ M' वर्ण देख रहा हूं क्योंकि यह कमांड-लाइन के लिए गूँज रहा है। मुझे नहीं पता कि SQL स्क्रिप्ट मूल रूप से किस OS पर बनाई गई थी।

यह क्या कारण है और मैं इसे कैसे ठीक करूं?

जवाबों:


79

यह डॉस / विंडोज लाइन-एंडिंग कैरेक्टर्स के कारण होता है। जैसे एंडी व्हिटफील्ड ने कहा, यूनिक्स कमांड dos2unix समस्या को ठीक करने में मदद करेगा। यदि आप अधिक जानकारी चाहते हैं, तो आप उस कमांड के लिए मैन पेज पढ़ सकते हैं।


3
कुछ सिस्टम (यानी उबंटू) पर इस कमांड का नाम "डिडोस" है
bobwienholt

6
आप OSX पर टूल बहुत आसानी से प्राप्त कर सकते हैं, brew install dos2unixजब आपने होमबॉव स्थापित किया हो
दीक्षा

73

viनिम्नलिखित को चलाकर लाइन अंत को ठीक करें :

:set fileformat=unix

:w


2
यह एक शानदार जवाब है। बहुत धन्यवाद। (सहेजा गया dos2unix, एक उपकरण जिसे मैं शायद केवल एक बार उपयोग
करूंगा

3
यह ^Mकिसी कारण से एस को नहीं हटाता है । संदर्भ फ़ाइल /etc/timidity/fluidr3_gm.cfg:।
दर्शन

39

इसका कारण यह है कि एक विंडोज-आधारित ओएस और यूनिक्स आधारित ओएस के बीच अंतर कैसे होता है जो अंत मार्करों को संग्रहीत करता है।

विंडोज आधारित ऑपरेटिंग सिस्टम, उनकी डॉस विरासत के लिए धन्यवाद, पात्रों की एक जोड़ी के रूप में एक एंड-ऑफ-लाइन स्टोर करते हैं - 0x0D0A(गाड़ी वापसी + टिकट फ़ीड)। यूनिक्स-आधारित ऑपरेटिंग सिस्टम सिर्फ 0x0A(एक लाइन फीड ) का उपयोग करते हैं । ^Mआप देख रहे हैं का एक दृश्य प्रतिनिधित्व है 0x0D(एक गाड़ी वापसी )।

dos2unix इसमें मदद करेगा। आपको शायद स्क्रिप्ट के स्रोत को 'यूनिक्स-अनुकूल' होने के लिए भी समायोजित करना होगा।


मैं यह नहीं कहूंगा कि विंडोज के वर्तमान संस्करणों में किसी भी तरह की डॉस विरासत है । उनके पास अभी भी संगतता संयम है, हालांकि।
जोए

यह आसान तरीका है, क्या आप एक स्वचालित रूपांतरण उपकरण है। के धन्यवाद
PJL

लेकिन क्यों ^M? क्यों '^'? क्यों 'एम'?
--३।

क्योंकि यह एक "नियंत्रण चरित्र" है। "^" नियंत्रण कुंजी पर क्लिक करने का दृश्य प्रतिनिधित्व है। इसके बस विशिष्ट बाइट्स के नीचे, ^ है कि कैसे संपादक उन्हें प्रतिनिधित्व करता है।
२०:१० बजे हेजाज़मैन

24

सबसे आसान तरीका उपयोग करना है viमुझे पता है कि यह भयानक लगता है, लेकिन इसका सरल और पहले से ही अधिकांश यूनिक्स वातावरण में स्थापित है। ^ एम विंडोज / डॉस वातावरण से एक नई लाइन है।

कमांड प्रॉम्प्ट से: $ vi filename

फिर :कमांड मोड में जाने के लिए " " दबाएं ।

सभी ग्लोबली खोजें और बदलें :%s/^M//g" प्रेस और होल्ड कंट्रोल तो वी दबाएं फिर एम " जो कि ^ एम को कुछ नहीं के साथ बदल देगा।

फिर लिखने और छोड़ने के लिए " :wq" पूरा किया!


इसे emacs में कैसे बदलें?
हरबर्ट 3

धन्यवाद! VI (M) बढ़िया है!
आयनॉकि बिज़ुआं

3
^ M वर्ण टाइप करने के बारे में विस्तार के लिए धन्यवाद! मैं इसके बजाय इसे \ r से बदलूंगा। तो मैंने किया:% s / ^ M / \ r / g
aharris88


10

Vi में, a :%s/^M//g

^Mपकड़ को प्राप्त करने के लिए CTRL, Vफिर दबाएं M(नियंत्रण कुंजी को पकड़े हुए दोनों) और ^Mदिखाई देगा। यह सभी घटनाओं का पता लगाएगा और उन्हें कुछ नहीं के साथ बदल देगा।


2
^ एम को एक यूनिक्स फ्रेंडली लाइन ब्रेक से बदलने के लिए::%s/^M/\r/g
गैरी ओक

8

SQL स्क्रिप्ट मूल रूप से विंडोज ओएस पर बनाई गई थी। '^ M' अक्षर, विंडोज और यूनिक्स का एक परिणाम है, जिसके बारे में अलग-अलग विचार हैं कि अंत वर्ण के लिए क्या उपयोग किया जाए। इसे ठीक करने के लिए आप कमांड लाइन पर पर्ल का उपयोग कर सकते हैं।

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

ज़रूर, आप perl का उपयोग कर सकते हैं, लेकिन क्या आप dos2unix पर पर्ल का सुझाव देंगे?
थॉमस ओवेन्स

2
मैं सिर्फ एक विकल्प प्रदान कर रहा हूं, क्योंकि चार लोग पहले से ही dos2unix का उपयोग करने के लिए कहते हैं।
छिपकली का बिल

2
हां, मुझे यह उपयोगी लगा क्योंकि मैं एक प्रागैतिहासिक आईटी विभाग के साथ एक कार्यालय में काम करने वाले एक पिछड़े कार्य केंद्र पर हूं। सिवाय मैंने एक भिन्नता का उपयोग किया: perl -pi -e "s / \ x0D / \ n / g" file.csv
Rimian

7

^ एम आमतौर पर विंडोज ऑपरेटर नईलाइन्स के कारण होता है, और यूनिक्स पर अनुवादित ए ^ एम जैसा दिखता है। कमांड dos2unix उन्हें अच्छी तरह से हटा देना चाहिए

dos2unix [विकल्प] [-c convmode] [-o फ़ाइल ...] [-एक शिशु पोशाक ...]


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

सैड और भी अधिक व्यापक रूप से उपलब्ध है और इस तरह की बात भी कर सकता है अगर dos2unix स्थापित नहीं है

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

आप भी कोशिश कर सकते हैं:

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

Vi संपादक में ^ M अक्षर को बदलने के लिए नीचे का उपयोग करें

टेक्स्ट फ़ाइल खोलें 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 मैं शिफ्ट + 6 कर रहा था, इसलिए मैंने वही किया जो हर हैकर करेगा और अपनी गलतफहमी को अपने हल से दूर करेगा: प्रत्येक लाइन के अंत में जाने के लिए $ करने के लिए एक मैक्रो रिकॉर्ड करें और फिर x दबाएं, बस फ़ाइल में लाइनों की संख्या के लिए मैक्रो दोहराएं।
darethas

3

dos2unixकमांड का एक विकल्प मानक उपयोगिताओं जैसे उपयोग करना होगा sed

उदाहरण के लिए, डॉस टू यूनिक्स:

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

यूनिक्स से डॉस:

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

1

आप फ़ाइलों को सीधे sed कमांड के माध्यम से ^ M हटा सकते हैं, जैसे:

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

यदि आप परिवर्तनों से खुश हैं, तो .bak फ़ाइलों को हटा दें:

rm -v *.bak


0

od -a $file लिनक्स पर उन प्रकार के प्रश्नों का पता लगाने के लिए उपयोगी है (उपरोक्त में डंपेक्स के समान)।


0

पर्ल में, यदि आप $ / वैरिएबल सेट नहीं करना चाहते हैं और chomp () का उपयोग कर सकते हैं:

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

मेरे दो सेंट


-1

एक और vi कमांड जो करेगा: :%s/.$// यह फ़ाइल में प्रत्येक पंक्ति के अंतिम वर्ण को हटा देता है। इस खोज और प्रतिस्थापित कमांड का दोष यह है कि यह परवाह नहीं करता है कि अंतिम वर्ण क्या है, इसलिए सावधान रहें कि इसे दो बार कॉल न करें।


इसका उल्लेख क्यों करें यदि आप जानते हैं कि यह विश्वसनीय नहीं है?
मेरावचन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.