2009-03-31 16 views
20

का उपयोग करके एक नई लाइन के साथ पंक्ति में कई नई पंक्तियों को प्रतिस्थापित करने के लिए मेरे पास रूबी में लिखी गई एक स्क्रिप्ट है। मैं (जैसे)रुबी

\n 
\n 
\n 

मेरे वर्तमान प्रयास काम किया (या बल्कि नहीं)

\n 

का उपयोग कर किसी भी डुप्लिकेट नई-पंक्तियों को हटाने की जरूरत

str.gsub!(/\n\n/, "\n") 

कौन सा मुझे उत्पादन के लिए कोई परिवर्तन नहीं दिया । मैं क्या गलत कर रहा हूं?

उत्तर

29

यह मेरे लिए काम करता है:

#!/usr/bin/ruby 

$s = "foo\n\n\nbar\nbaz\n\n\nquux"; 

puts $s 

$s.gsub!(/[\n]+/, "\n"); 

puts $s 
+1

ब्रैकेट क्यों? –

+0

चूंकि वह एक साल पहले था, मुझे कोई जानकारी नहीं है। मुझे उम्मीद है कि मैंने कोशिश की है \ n + /, जैसा कि मैं पर्ल में उपयोग करता हूं, और यह मेरे लिए काम नहीं करता है, शायद इसलिए कि मैंने कुछ और गलत किया है। –

+0

मुझे लगता है कि s.gsub! (/ \ N + /, "\ n") काम करता है। कम से कम यह मेरे लैपटॉप में काम करता है। – swcai

4

क्या आप सुनिश्चित हैं कि यह \ n \ n \ n /, "\ n" नहीं होना चाहिए जो आप उपरोक्त प्रश्न में क्या चाहते हैं।

भी, क्या आप वाकई विंडोज़ नई लाइन "\ r \ n" नहीं कर रहे हैं?

संपादित करें: अतिरिक्त जानकारी

प्रति टिप्पणी

"। नई-पंक्तियों की मात्रा बदल सकते अलग लाइनों 2 से 5 नई-पंक्तियों की है।"

अगर आप केवल 2-5 लाइनों हिट करने के लिए चाहते हैं की कोशिश इस

/\n{2,5}/, "\n" 
+0

नई-पंक्तियों की राशि बदल सकते हैं। विभिन्न लाइनों में 2 और 5 न्यूलाइन के बीच है। – Macha

+1

'\ r \ n' कॉलआउट के लिए बहुत धन्यवाद। इसके लायक होने के लिए, यह केवल विंडोज़ ही नहीं है - मैं अपने लिनक्स बॉक्स पर एक रेल साइट पर टेक्स्टरेरा इनपुट से डेटा का उपयोग करते समय इसमें भाग गया। अनुमोदित, अन्य कारक डेटा को भी प्रभावित कर सकते हैं, लेकिन मुद्दा यह है कि विंडोज उनमें से एक नहीं है। – DreadPirateShawn

+1

\ r \ n पूरी तरह से काम किया। सही समाधान खोजने के लिए 1.5hr खर्च करें और यहां यह है। धन्यवाद @ केंग – sapatelbaps

6

सीधे शब्दों में बंटवारे और लाइनों के पुनर्संयोजन के वांछित परिणाम

>> "one\ntwo\n\nthree\n".split.join("\n") 
=> "one\ntwo\nthree" 

संपादित दे देंगे: मैं सिर्फ इस पर ध्यान न्यूलाइन के साथ सभी व्हाइटस्पेस सबस्ट्रिंग्स को प्रतिस्थापित करेगा, उदाहरण के लिए

>> "one two three\n".split.join("\n") 
=> "one\ntwo\nthree" 

सबसे पहले यह जांचें कि आप यही चाहते हैं!

+0

अच्छा एक - यह करने का यह शानदार तरीका है! – Brian

+0

धन्यवाद, मैंने इसे उत्तर के रूप में चुना लेकिन फिर एहसास हुआ कि यह रिक्त स्थान पर भी विभाजित है, जो मेरे मामले में अच्छा नहीं है। उसके लिए माफ़ करना। – Macha

+0

आप सही हैं। आप str.split (/ \ n + /) लेकिन चास का उपयोग कर सकते हैं। ओवेन्स का समाधान सरल है। – finnw

-2

रूबी की जरूरत बैकस्लैश अलग ढंग से भाग निकले से प्रदान की है।

str.sub!("\\\\n+\\\\n","\\\\n") 

http://www.ruby-forum.com/topic/176239

1

सीधे शब्दों में बुला विभाजन भी अपने खाली स्थान के के सभी बाहर ट्रिम जाएगा।

आप विभाजित करने के लिए

>> "one ok \ntwo\n\nthree\n".split(/\n+/).join("\n") 
=> "one ok \ntwo\nthree" 
5

आप एक अनंत राशि के लिए एक से अधिक न्यू लाइन अप मैच के लिए की जरूरत है \n पारित करने के लिए की जरूरत है।आपका कोड उदाहरण सिर्फ एक छोटी सी ट्वीक के साथ काम करेंगे:

str.gsub!(/\n+/, "\n") 

उदाहरण के लिए:

str = "this\n\n\nis\n\n\n\n\na\ntest" 
str.gsub!(/\n+/, "\n") # => "this\nis\na\ntest" 
1

साथ ही, यह भी रिक्त लाइनों पर

  • रिक्त स्थान के साथ काम करता
  • n वापस की संख्या खाली लाइनों को वापस करने के लिए

str.gsub!/\ N^\ s * \ N /, "\ n \ n"

जहां,

  • \ N पाठ्यक्रम न्यू लाइन की है
  • \ रों अंतरिक्ष
  • है अर्थ है 1 या
+0

यह इस धागे में सबसे सटीक उत्तर है। –

+0

शायद इनमें से कोई भी '\ r' वर्ण को संबोधित करता है। मैं इसे निम्न में संशोधित करूंगा: 'str.gsub (/ [\ n \ r] +^\ s * [\ r \ n] + /," \ n \ n ")' – Dex

9

gsub के बजाय अधिक idiomatic String#squeeze का उपयोग करें।

str = "a\n\n\nb\n\n\n\n\n\nc" 
str.squeeze("\n") # => "a\nb\nc" 
-1

यह यह मेरे लिए काम किया प्रयास करें:

s = test\n\n\nbar\n\n\nfooo 

s.gsub("\n\n", '')