Vim / sed में सिंगल ब्लैंक लाइन के साथ मल्टीपल ब्लैंक लाइन्स को बदलना


42

प्रश्न कमोबेश यह सब कहता है। मुझे पता है कि /^$/dसभी खाली लाइनों को हटा देंगे, लेकिन मैं यह नहीं कह सकता कि 'दो या अधिक रिक्त लाइनों को एक ही रिक्त रेखा से कैसे बदलें'

कोई विचार?

जवाबों:


48

यदि आप किसी अन्य उपयोग के लिए वीम या सेड फायरिंग नहीं कर रहे हैं, तो बिल्ली के पास वास्तव में कई खाली लाइनों को ढहाने का एक आसान तरीका है, बस उपयोग करें cat -s

यदि आप पहले से ही विम में थे और वहां रहना चाहते थे, तो आप आंतरिक खोज के साथ ऐसा कर सकते थे और जारी करके प्रतिस्थापित कर सकते थे: :%s!\n\n\n\+!^M^M!g(^ M एक न्यूलाइन का दृश्य प्रतिनिधित्व है, आप इसे मारकर Ctrl+ दर्ज कर सकते हैं vEnter), या खुद को बचा सकते हैं। केवल बिल्ली के लिए खोलकर टाइपिंग :%!cat -s:।


वाह, -sबिल्ली का विकल्प नहीं जानता था - सिर्फ एक ऐतिहासिक नोट, यह POSIX में नहीं है, लेकिन बीएसडी और जीएनयू बिल्ली में उपलब्ध है।
मैक्सक्लेपजिग

2
के लिए 'जीत' के रूप में चिह्नित :%!cat -s। हर रोज़ कुछ सीखें GNnew!
एंड्रयू बोलस्टर

3
मुझे लगता है कि आप इस तरह ^ M के बजाय \ r का उपयोग कर सकते हैं:%s!\n\n\n\+!\r\r!g
निको बेलिक

मुझे आज इसकी जरूरत थी। धन्यवाद, कालेब! :)
--v16d

19

\nखोज पैटर्न में एक नई रेखा इंगित करने के लिए उपयोग करें । का प्रयोग करें Ctrl+ Mप्रतिस्थापन पाठ, या एक backreference में। देखें :help patternऔर :help sub-replace-special(से लिंक :help :s)

%s/\(\n\n\)\n\+/\1/

क्या आप कृपया बता सकते हैं कि खोज पैटर्न कैसा है?
सागर जैन

@ एसजेएमपी आवश्यकता: दो या दो से अधिक रिक्त लाइनों को एकल रिक्त लाइन से बदलें। कार्यान्वयन: केवल दो नए समाचारों के साथ तीन या अधिक लगातार नए समाचारों को प्रतिस्थापित करें। कमांड में उपयोग किए गए निर्माणों की व्याख्या के लिए मैनुअल देखें।
गिल्स एसओ-बुराई को रोकें '

लेकिन इसकी सामग्री तय होने पर आपको समूह का उपयोग करने की आवश्यकता क्यों है?
सबुनकु

@Sabuncu आपको एक समूह का उपयोग करने की आवश्यकता नहीं है। लेकिन एक समूह का उपयोग क्यों नहीं? यहां, मैंने एक समूह का उपयोग किया है क्योंकि आप प्रतिस्थापन पाठ में एक नई पंक्ति के साथ एक कमांड को कॉपी-पेस्ट नहीं कर सकते हैं: आपको एक शाब्दिक Ctrl + M वर्ण सम्मिलित करने की आवश्यकता है, \nजो प्रतिस्थापन पाठ में काम नहीं करता है।
गिल्स एसओ- बुराई को रोकना '

अब मैं समझता हूं, उत्तर देने के लिए समय निकालने के लिए धन्यवाद।
सबुनकु

6

यदि विम में, बस यह करें:

:%!cat -s

2
आप इस बारे में थोड़ा विस्तार जोड़ना चाह सकते हैं कि यह कैसे काम करता है, भले ही यह manपृष्ठ का एक उद्धरण हो ।
जसोनव्रीयन

विंडोज पर काम नहीं किया 7
user674669

0

पर्ल का उपयोग करना:

perl -00 -pe ''

-00 कमांड लाइन विकल्प पैरा स्लरप मोड को चालू करता है, जिसका अर्थ है पर्ल, लाइन द्वारा लाइन के बजाय पैरा द्वारा टेक्स्ट पैराग्राफ को पढ़ता है।


0

सीड (GNU sed) के साथ 4.2.2:

sed -r '
  /^\s*$/ { 
    # blank line
:NEXT
    N # append next line to pattern space - if none, autoprint PS and exit
    s/^\s*$\n^\s*$//g;t NEXT # if 2 blank lines, clear PS and loop to NEXT
  }
  # else, autoprint PS and next/exit
' < $MYFILE

-2

मुझे पता है कि यह मूर्खतापूर्ण कोड है, लेकिन मैं 10 मिनट से कम समय में इस मुद्दे को हल करना चाहता था, और यह काम किया

for file in /directory/*
do
  originalname=$file
  us='_'
  tempname=$file$us
  echo $originalname
  mv $originalname $tempname
  uniq $tempname $originalname
  rm $tempname
done

1
uniqसमीपवर्ती समान रेखाओं को हटाता है। जो ओपी नहीं चाहता है।
पचोलिक

@pacholik उन्होंने स्पष्ट रूप से कहा "एक रिक्त लाइन के साथ कई रिक्त लाइनों की जगह" आसन्न समान रेखाओं को न हटाएं !!!
महमूद ज़ाल्ट

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