विम में एक नईलाइन द्वारा एक चरित्र को कैसे बदला जाए


1967

मैं ,वर्तमान फ़ाइल में प्रत्येक को एक नई पंक्ति द्वारा बदलने का प्रयास कर रहा हूँ :

:%s/,/\n/g 

लेकिन यह सम्मिलित करता है कि ^@वास्तविक न्यूलाइन के बजाय क्या दिखता है । फ़ाइल डॉस मोड या कुछ भी नहीं है।

मुझे क्या करना चाहिए?

यदि आप मेरे जैसे जिज्ञासु हैं, तो प्रश्न की जाँच करें कि विम के लिए \ ra newline क्यों है? भी।


2
स्टैक ओवरफ्लो प्रोग्रामिंग और विकास के सवालों के लिए एक साइट है। यह प्रश्न ऑफ़-टॉपिक प्रतीत होता है क्योंकि यह प्रोग्रामिंग या विकास के बारे में नहीं है। देखें किन विषयों मैं यहाँ के बारे में पूछ सकते हैं सहायता केंद्र में। शायद सुपर यूजर या यूनिक्स और लिनक्स स्टैक एक्सचेंज पूछने के लिए बेहतर जगह होगी।
jww

5
@jww यह सवाल 10 साल पुराना है ... लगता है कि यह बहुत पुराना है। इस तरह के बहुत सारे सवाल हैं, उदाहरण के लिए: stackoverflow.com/questions/10175812/…
Vinko Vrsalovic

14
@jww vim सामान्यतः प्रोग्रामर के लिए प्रयोग किया जाता है एक उपकरण है, और उपकरणों आमतौर पर प्रोग्रामर के लिए प्रयोग किया जाता है के बारे में सवाल में विषय पर हैं स्टैक ओवरफ़्लो । हालांकि स्पष्ट रूप से यह वी और विम पर अधिक उपयुक्त है ।
user202729

जवाबों:


2565

के \rबजाय का उपयोग करें \n

\nपाठ में एक अशक्त चरित्र सम्मिलित करके प्रतिस्थापित । एक नई लाइन पाने के लिए, का उपयोग करें \r। हालांकि , एक नई पंक्ति की खोज करते समय , आप अभी भी उपयोग करेंगे \n। यह विषमता इस तथ्य के कारण है कि \nऔर \r कुछ अलग चीजें हैं :

\nलाइन के अंत (न्यूलाइन) से \rमेल खाता है , जबकि एक गाड़ी वापसी से मेल खाती है। दूसरी ओर, प्रतिस्थापन में \nएक शून्य चरित्र \rसम्मिलित करता है जबकि एक नई रेखा सम्मिलित करता है (अधिक सटीक रूप से, इसे इनपुट के रूप में माना जाता है <CR>)। इसका वर्णन करने के लिए यहां एक छोटा, गैर-संवादात्मक उदाहरण दिया गया है, विम कमांड लाइन फीचर का उपयोग करके (दूसरे शब्दों में, आप इसे चलाने के लिए निम्नलिखित को एक टर्मिनल में कॉपी और पेस्ट कर सकते हैं)। xxdपरिणामी फ़ाइल का एक हेक्सडंप दिखाता है।

echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/\n/' '+s/a/\r/' +wq
(echo 'After:'; xxd test) >> output.txt
more output.txt
Before:
0000000: 6261 720a                                bar.
After:
0000000: 000a 720a                                ..r.

दूसरे शब्दों \nमें, पाठ में बाइट 0x00 डाला गया है; \rबाइट 0x0a डाला गया है।


127
/ r को Enter / Return कुंजी को दबाने के रूप में माना जाता है। यह सभी प्लेटफार्मों पर काम करता है।
लुका मारिंको


14
काश यह क्लासिक vi के लिए काम करता। AIX v6.1 पर, \rइस तरह काम नहीं करता है। लेकिन आप Ctrl-V Enterटाइपिंग की जगह प्रेस कर सकते हैं \r, और यह काम करता है।
इस्कॉर्ट्सो

3
मुझे पार्टी की देर है। यदि \rआवेषण <CR>और \nएक नल सम्मिलित करता है, तो मैं एक गाड़ी वापसी के साथ कुछ कैसे बदलूंगा?
श्री लामा

2
@SunnyRaj क्या आप CR और LF के इतिहास के बारे में निश्चित हैं? मुझे आभास हो रहा था कि मूल रूप से LF ने एक पंक्ति आगे बढ़ाई है लेकिन प्रिंटहेड को स्थानांतरित नहीं किया है, और CR ने प्रिंटहेड को स्थानांतरित किया लेकिन कागज को स्थानांतरित नहीं किया। परिणामस्वरूप, यदि आपका OS मुद्रण से पहले इनपुट को परिवर्तित नहीं करता है, तो आप सही आउटपुट प्राप्त करने के लिए सिर्फ LF और CR का उपयोग नहीं कर सकते। एमएस डॉस ने कच्चे प्रिंटर डेटा का उपयोग टेक्स्ट फाइल फॉर्मेट के रूप में किया, मैक ओएस ने सीआर का उपयोग किया और उस से प्रिंटर के कच्चे प्रारूप में परिवर्तित हो गया और यूनिक्स ने एलएफ का उपयोग किया और उस से प्रिंटर के कच्चे प्रारूप में परिवर्तित हो गया।
मिकको रेंटालीनें

210

यहाँ चाल है:

सबसे पहले, अपने वीए (एम) सत्र को विशेष वर्णों (यानी: नईलाइन) के साथ मिलान करने की अनुमति दें। शायद यह लाइन आपके .vimrc या .exrc फ़ाइल में डालने लायक है:

:set magic

अगला, करें:

:s/,/,^M/g

^Mवर्ण प्राप्त करने के लिए Ctrl+ टाइप करें Vऔर हिट करें Enter। विंडोज के अंतर्गत, ऐसा Ctrl+ Q, Enter। एक ही तरीका है कि मैं उन्हें याद कर सकता हूं कि वे कितना कम समझदारी से याद करते हैं:

A: एक नई रेखा का प्रतिनिधित्व करने के लिए सबसे खराब नियंत्रण-पात्र क्या होगा?

बी: या तो q(क्योंकि आमतौर पर इसका मतलब है "छोड़ो") या vक्योंकि गलती से Ctrl+ टाइप Cकरना और संपादक को मारना इतना आसान होगा ।

A: इसे बनाओ।


9
मैं विंडोज पर GVim का उपयोग कर रहा हूं, और मुझे न तो इसकी आवश्यकता है :set magic(यह मेरे ~ / _vimrc में नहीं है) या ctrl-q। बस एक सरल ctrl-vप्रवेश द्वारा ^Mमेरे लिए चरित्र ठीक बनाता है।
क्रिस फिलिप्स

5
Cv एक नई रेखा का प्रतिनिधित्व नहीं करता है; यह "अगले शाब्दिक चरित्र से बच" कमांड है। मुझे पता नहीं है कि Cv या तो के लिए एक महामारी है, लेकिन इसका एक कारण यह है कि यह मानसिक रूप से न्यूलाइन को मैप नहीं करता है।
जिम स्टीवर्ट

27
Ctrl-v "वर्बेटिम" के लिए एक शब्दांश है - यानी इसके "वर्बटीम" कीकोड / चरित्र के लिए दबाए गए अगले कुंजी से बचें। विंडोज में यह पेस्ट है: चीजों को परिचित रखने के लिए। Ctrl-Q शायद "(अन) उद्धरण" के लिए है। वैसे भी बेवकूफ - लेकिन आप इसे बाइनरी फ़ाइलों में उपयोग कर सकते हैं - जैसे Ctrl-Z के माध्यम से Ctrl-A खोजने के लिए (Ascii 1-26 मुझे लगता है)।
टॉमस गैंडर

1
Ctrl-Cवास्तव में संपादक को नहीं मारता है, हालांकि यह आपको वापस सामान्य मोड में रद्द कर सकता है। Ctrl-Vशब्दशः का अर्थ है, और Ctrl-Qइसका मतलब है कि किसी ने $VIMRUNTIME/mswin.vimकॉन्फ़िगरेशन फ़ाइल लोड करने की गलती की । आपको mswin की आवश्यकता नहीं है। इसके बजाय बस अपने खुद के vimrc का उपयोग करें।
00dani

वाह यह आश्चर्यजनक है। मैं sed -n l अब तक करता था। यह जानकर अच्छा लगता है कि उसी को प्राप्त किया जा सकता है Ctrl-v
शाम

98

सिंटैक्स में s/foo/bar, \rऔर \nसंदर्भ के आधार पर अलग-अलग अर्थ हैं।


कम:

के लिए foo:

\ n = newline (लिनक्स पर मैक / मैक, विंडोज पर सीआर + एलएफ)
\ r = गाड़ी वापसी (सीआर)

के लिए bar:

\ r = newline
\ n = नल बाइट है।

लंबा (ASCII संख्या के साथ):

NUL= 0x00 = 0 = Ctrl+ @
LF= 0x0A = 10 = Ctrl+ J
CR= 0x0D = 13 = Ctrl+M

यहाँ ASCII नियंत्रण वर्णों की एक सूची दी गई है । उन्हें Ctrl+ V, Ctrl+ के माध्यम से विम में डालें ---key---

बैश या अन्य यूनिक्स / लिनक्स गोले में, बस Ctrl+ टाइप करें ---key---

बश में Ctrl+ आजमाएँ M। यह हिटिंग के समान है Enter, क्योंकि शेल को पता चलता है कि क्या मतलब है, भले ही लिनक्स सिस्टम लाइन परिसीमन के लिए लाइन फीड का उपयोग करता है।

शाब्दिक को बैश में सम्मिलित करने के लिए, उन्हें Ctrl+ के साथ जोड़ना Vभी काम करेगा।

बैश में प्रयास करें:

echo ^[[33;1mcolored.^[[0mnot colored.

यह ANSI एस्केप सीक्वेंस का उपयोग करता है । सम्मिलित दो ^['के माध्यम से एस Ctrl+ V, Esc

आप Ctrl+ V, Ctrl+ M, भी कोशिश कर सकते हैं Enter, जो आपको यह देगा:

bash: $'\r': command not found

\rऊपर से याद है? :>

यह ASCII नियंत्रण वर्ण सूची एक पूर्ण ASCII प्रतीक तालिका से अलग है , जिसमें नियंत्रण वर्ण, जो Ctrlकुंजी (haha) के माध्यम से एक कंसोल / स्यूडोटर्मिनल / विम में डाला जाता है , वहां पाया जा सकता है।

जबकि C और अधिकांश अन्य भाषाओं में, आप आमतौर पर इन 'वर्णों' का प्रतिनिधित्व करने के लिए अष्टक कोड का उपयोग करते हैं।

यदि आप वास्तव में जानना चाहते हैं कि यह सब कहां से आता है: TTY ध्वस्त । यह इस विषय के बारे में सबसे अच्छा लिंक होगा, लेकिन सावधान रहें: ड्रेगन हो।


टी एल; डॉ

आमतौर पर foo= \n, और bar= \r


1
तो मैं आप कैसे एक गाड़ी वापसी के साथ एक चरित्र स्थानापन्न होगा
२३:२५ पर कोडेशोट

2
@ कोडेशोत :s/x/^M/gको करना चाहिए। इसके बाद के ^Mमाध्यम से डालें । ctrl-vctrl-m
एसजेड

3
धन्यवाद sjas, तुम्हें पता है कि यह सवाल अब तक के सबसे अजीब में से एक है। जवाब के लिए 1008 वोट जो मूल रूप से कहते हैं कि "विम ने जो पाया, उससे अधिक कुछ नहीं है। ऐसा इसलिए है क्योंकि विम आपको जो मिला है वह करता है। कभी भी यह मत भूलो कि विम आपको क्या मिला।" मैं पैटर्न में दिलचस्प पात्रों के लिए कोड की एक शॉर्टलिस्ट होने की उम्मीद कर रहा था, प्रतिस्थापन और अजीबता का कारण है ताकि अन्य समान अजीबता को याद रखना और भविष्यवाणी करना आसान हो। मुझे मेरा वोट मिला होगा।
कोडेशोट

@ asodi नियंत्रण पात्रों की सूची में आपकी मदद कर सकता है। आगे के संदर्भ के लिए cs.tut.fi/~jkorpela/chars/c0.html देखें । मैं दो लिंक शामिल करने के लिए अपने उत्तर को अपडेट करूंगा।
sjas

55

आपको उपयोग करने की आवश्यकता है:

:%s/,/^M/g

^Mवर्ण प्राप्त करने के लिए , Ctrl+ के vबाद दबाएँ Enter


4
मुझे ^ M अक्षर प्राप्त करने के लिए <Cv> <Cm> करना होगा।
जेजेन थॉमस

39

\r आप के लिए यहाँ काम कर सकते हैं।


24

विंडोज पर विम के साथ, Ctrl+ Qके स्थान पर Ctrl+ का उपयोग करें V


16

मेरे सोचने के तरीके के लिए यह सबसे अच्छा जवाब है, लेकिन यह एक तालिका में अच्छा होगा:

विम के लिए \ ra newline क्यों है?

तो, रिवाइडिंग:

आपको एक रेगेक्स रिप्लेसमेंट में \rएक लाइन फीड (ASCII 0x0A, यूनिक्स न्यूलाइन) का उपयोग करने की आवश्यकता है , लेकिन यह प्रतिस्थापन के लिए अजीब है - आपको आम तौर पर \nलाइन फीड और के लिए उपयोग करने की उम्मीद करनी चाहिए\r कैरिज रिटर्न के लिए ।

इसका कारण यह है कि विम \nको NIL चरित्र (ASCII 0x00) से बदलने के लिए उपयोग किया जाता है । आपने \0इसके बजाय, NIL से \nलाइन फीड के लिए इसके सामान्य उपयोग के लिए मुक्त होने की उम्मीद की होगी , लेकिन \0पहले से ही regex प्रतिस्थापन में एक अर्थ है, इसलिए इसे स्थानांतरित कर दिया गया था \n। इसलिए फिर से आगे जाने के \nलिए \r(जहां एक regex पैटर्न में गाड़ी वापसी चरित्र, ASCII है 0x0D) से नईलाइन को स्थानांतरित करना है ।

चरित्र | ASCII कोड | सी प्रतिनिधित्व | रेगेक्स मैच | रेगेक्स रिप्लेसमेंट
------------------------- + ------------ + ----------- ------- + ------------- + ------------------------
नील | 0x00 | \ 0 | \ 0 | \ n
लाइन फीड (यूनिक्स न्यूलाइन) | 0x0a | \ n | \ n | \ r
गाड़ी वापसी | 0x0d | \ r | \ r | <अज्ञात>

NB: ^M( Ctrl+ V Ctrl+ Mलिनक्स पर) जब एक रेगेक्स रिप्लेसमेंट में इस्तेमाल किया जाता है तो एक गाड़ी के बजाय एक नई लाइन डालते हैं जैसा कि दूसरों ने सलाह दी है (मैंने अभी इसकी कोशिश की थी)।

यह भी ध्यान दें कि जब यह फ़ाइल प्रारूप सेटिंग्स के आधार पर फ़ाइल को सहेजता है और जो मामलों को भ्रमित कर सकता है, तो विम लाइन फ़ीड वर्ण का अनुवाद करेगा।


11

से ग्रहण , ^Mवर्ण एक लाइन में एम्बेड किया जा सकता, और आप उन्हें नई-पंक्तियों को परिवर्तित करना चाहते हैं।

:s/\r/\r/g

8

लेकिन अगर किसी को स्थानापन्न करना है, तो निम्न काम करता है:

:%s/\n/\r\|\-\r/g

उपरोक्त में, प्रत्येक अगली पंक्ति को अगली पंक्ति के साथ प्रतिस्थापित किया जाता है, और फिर |-और फिर एक नई पंक्ति। इसका उपयोग विकि तालिकाओं में किया जाता है।

यदि पाठ इस प्रकार है:

line1
line2
line3

इसे बदल दिया जाता है

line1
|-
line2
|-
line3

7

यदि आपको इसे पूरी फ़ाइल के लिए करना है, तो मुझे यह भी सुझाव दिया गया था कि आप कमांड लाइन से कोशिश कर सकते हैं:

sed 's/\\n/\n/g' file > newfile

1
ध्यान दें कि इसके लिए GNU sed की आवश्यकता है। printf 'foo\\nbar\n' | sed 's/\\n/\n/g'यह देखने की कोशिश करें कि क्या यह आपके सिस्टम पर काम करेगा। (इस सुझाव के लिए freenode पर #bash के अच्छे लोगों को श्रेय।)
इवान डोनोवन

हां, लेकिन सवाल विम के बारे में था। स्टैक ओवरफ्लो प्रश्न है मैं sed का उपयोग करके एक नई लाइन (\ n) को कैसे बदल सकता हूं?
पीटर मोर्टेंसन

5

यहाँ जवाब है कि मेरे लिए काम किया है। इस आदमी से:

---- प्रतिस्थापन में एक नई लाइन डालने के लिए vi संपादक का उपयोग करें


मुझे कुछ और करना है और याद नहीं करना है और फिर देखना होगा।

Vi में, एक खोज में एक नया वर्ण सम्मिलित करने और बदलने के लिए, निम्नलिखित कार्य करें:

:%s/look_for/replace_with^M/g

ऊपर दी गई कमांड "look_for" के सभी उदाहरणों को "replace_with \ n" (with \ n अर्थ न्यूलाइन) के साथ बदल देगी।

"^ M" प्राप्त करने के लिए, कुंजी संयोजन Ctrl+ दर्ज करें V, और उसके बाद (सभी कुंजी छोड़ें) Enterकुंजी दबाएं।


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