केवल सिंगल न्यूलाइन्स को बदलने का एक बेहतर तरीका होना चाहिए?


27

मुझे प्रति वाक्य एक पंक्ति लिखने की आदत है क्योंकि मैं आमतौर पर चीजों को LaTex में संकलित करता हूं, या कुछ अन्य प्रारूप में लिख रहा हूं जहां लाइन ब्रेक को अनदेखा किया जाता है। नए पैराग्राफ की शुरुआत को इंगित करने के लिए मैं एक खाली लाइन का उपयोग करता हूं।

अब, मेरे पास एक फाइल इस शैली में लिखी गई है जिसे मैं केवल सादे पाठ के रूप में भेजना चाहता हूं। मैं सभी सिंगल लाइनब्रेक को हटाना चाहता हूं लेकिन डबल लाइनब्रेक को बरकरार रखना चाहता हूं। यही मैंने किया है:

sed 's/$^/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt

यह कुछ पाठों के साथ खाली लाइनों को बदल देता है मुझे विश्वास है कि फाइल में दिखाई नहीं देता है: NEWLINEऔर फिर इसे awk के साथ सभी पंक्ति विराम से छुटकारा मिल जाता है (मुझे लगता है कि किसी वेबसाइट पर यह चाल है) और फिर यह NEWLINEएस को अपेक्षित दो लाइनब्रेक के साथ बदल देता है। ।

यह एक बहुत आसान काम करने के लिए एक लंबे घुमावदार तरीके की तरह लगता है। क्या कोई सरल तरीका है? इसके अलावा, यदि सिंगल स्पेस के साथ कई स्पेस (जो कभी-कभी किसी कारण से रेंगते हैं) को बदलने का एक तरीका है, तो यह भी अच्छा होगा।

मैं emacs का उपयोग करता हूं, इसलिए यदि कुछ emacs विशिष्ट चाल है जो अच्छी है, लेकिन मैं एक शुद्ध sed या शुद्ध awk संस्करण देखूंगा।


पहली सीड-कमांड में आपका मतलब ^ $, $ नहीं था।
उपयोगकर्ता अज्ञात

@user हाँ, हाँ मैंने किया।
सीमस

सभी लाइन ब्रेक को हटाने का एक आसान तरीका tr -d "\n":।
jfg956

जवाबों:


18

आप इस तरह awk का उपयोग कर सकते हैं:

$ awk ' /^$/ { print; } /./ { printf("%s ", $0); } ' test

या यदि आपको अंत में एक अतिरिक्त नई लाइन की आवश्यकता है:

$ awk ' /^$/ { print; } /./ { printf("%s ", $0); } END { print ""; } ' test

या यदि आप पैराग्राफ को एक नई रेखा से अलग करना चाहते हैं:

$ awk ' /^$/ { print "\n"; } /./ { printf("%s ", $0); } END { print ""; } ' test

ये awk कमांड पैटर्न द्वारा पहरे वाली क्रियाओं का उपयोग करते हैं:

/regex/

या

END

एक निम्न क्रिया को केवल तभी निष्पादित किया जाता है यदि पैटर्न वर्तमान लाइन से मेल खाता है।

और ^$.पात्रों का नियमित अभिव्यक्तियों में विशेष अर्थ होता है, जहां ^रेखा की शुरुआत, $अंत और .एक मनमाना चरित्र से मेल खाता है ।


यह अच्छा है, हालांकि मैं पैराग्राफ के बीच की खाली लाइन रखना पसंद करूंगा । मुझे लगता है कि आप पहले प्रिंट कमांड में कहीं एक अतिरिक्त नई लाइन जोड़कर ऐसा कुछ कर सकते हैं? इसके अलावा, क्या /./कर रहा है: यह स्ट्रिंग मैच की तरह और उसके elseलिए /^$/सही प्रतीत होता है?
सीमस

1
@ सीमस, सुनिश्चित करें - बस पहले प्रिंट को बदलें (उत्तर को अपडेट करें) - / / सभी रेखाओं से मेल खाता है जो कम से कम एक वर्ण लंबा है, अर्थात / ^ $ / पैटर्न का पूरक जो केवल खाली लाइनों से मेल खाता है।
मैक्सक्लेपजिग

9

एक फ़ाइल पैराग्राफ, जहां पैराग्राफ को रिक्त लाइनों द्वारा अलग किया जाता है, को संसाधित करने के लिए ऑक या पर्ल के पैराग्राफ मोड का उपयोग करें ।

awk -vRS= '
  NR!=1 {print ""}      # print blank line before every record but the first
  {                     # do this for every record (i.e. paragraph):
    gsub(" *\n *"," "); # replace newlines by spaces, compressing spaces
    sub(" *$","");      # remove spaces at the end of the paragraph
    print
  }
'
perl -000 -pe '             # for every paragraph:
  print "\n" unless $.==1;  # print a blank line, except before the first paragraph
  s/ *\n *(?!$)/ /g;        # replace newlines by spaces, compressing spaces, but not at the end of the paragraph
  s/ *\n+\z/\n/             # normalize the last line end of the paragraph
'

बेशक, चूंकि यह (ला) टीएक्स को पार्स नहीं करता है, यह भयानक रूप से टिप्पणियों, शब्दशः वातावरण और अन्य विशेष-वाक्यविन्यासों को विकृत करेगा। आप डीईटीएक्स या अन्य (ला) टीएक्स-टू-टेक्स्ट कन्वर्टर्स में देखना चाहते हैं ।


8

सैड सॉल्यूशन

$ sed -e ':a;N;$!ba;s/\(.\)\n/\1 /g' -e 's/\n/\n\n/' test.text

ध्यान दें, इस समाधान :aमें एक लेबल बना रहा है और aकमांड का उपयोग नहीं कर रहा है ।

मल्टीपल स्पेस की जगह

उपयोग करें tr:$ tr -s ' ' <test.text


8

मैं सही ढंग से समझ में आ गया है, एक खाली पंक्ति, लगातार दो नई-पंक्तियों का अर्थ है \n\n

यदि ऐसा है, तो एक संभव समाधान newlines की सभी विलक्षण घटनाओं को खत्म करना होगा।

Perl में, यह देखने का एक तरीका है:

$ perl -0777 -i -pe 's/\n(?=[^\n])//g' test
  • -0777ध्वज को प्रभावी ढंग से एक भी स्ट्रिंग में पूरी फ़ाइल slurps
  • -p डिफ़ॉल्ट रूप से काम कर रहे स्ट्रिंग को प्रिंट करने के लिए पर्ल बताता है
  • -i इन-प्लेस संपादन निर्दिष्ट करता है
  • वैश्विक मिलान सुनिश्चित करता है कि सभी सिंगल न्यूलाइन घटनाओं से निपटा जाए

इसमें एक समस्या यह है कि वाक्यों के बीच रिक्त स्थान नहीं हैं।
स्टीवन डी

6

(एक प्राचीन प्रश्न को पुनर्जीवित करना)

ऐसा लगता है कि वास्तव में क्या कर रहे हैं fmtऔर parअनुच्छेद के लिए सुधार कर रहे हैं। आप की तरह (और भी कई कार्यक्रमों की तरह) वे पैराग्राफ सीमाओं को एक (या अधिक) रिक्त लाइनों के रूप में परिभाषित करते हैं। इनमें से किसी एक के माध्यम से अपने पाठ को पाइप करने का प्रयास करें।

fmt एक मानक यूनिक्स उपयोगिता है और इसे जीएनयू कोरुटिल्स में पाया जा सकता है।

parfmtएडम एम। कॉस्टेलो द्वारा लिखा गया एक बहुत बढ़ा-चढ़ाकर लिखा जा सकता है, जिसे http://www.nicemice.net/par/ पर पाया जा सकता है (इसे कई वितरणों के लिए भी पैक किया गया है, जिसमें डेबियन भी शामिल है - मैंने इसे जनवरी 1996 में डेबियन के लिए पैक किया था, हालाँकि अब pkg के लिए एक नया अनुरक्षक है।)


6
sed -e'/./{H;$!d;}' -e'x;s/\n//g'

sedकिसी भी लाइन को Hपुराने स्थान पर जोड़ देगा जिसमें कम से कम एक वर्ण हो। यह तुरंत dउन सभी को ईलेट करता है, जिनमें से शायद अंतिम को छोड़कर। केवल वही पंक्तियाँ रह सकती हैं जो रिक्त हैं, और यह इन पंक्तियों पर है जब sedxपकड़ और पैटर्न रिक्त स्थान को बदलता है और सभी संचित \nelineline वर्णों को हटा देता है ।

यदि आप ऐसी रेखाएँ चाहते हैं जिनमें केवल <tab> या <रिक्तियाँ> को रिक्त माना जाए, तो /./ऊपर दिए गए पते को बदल दें /[^[:blank:]]/। रिक्त स्थान को निचोड़ने के लिए भी:

 sed -e'/./{H;$!d;}'    \
     -e'x;s/\n//g'      \
     -e's/\([[:blank:]]\)*/\1/g'

5

गाइल्स के पर्ल और कॉम्पैक्ट उदाहरणों को देखने के बाद, मैं इसे पोस्ट करने के लिए अनिच्छुक था, लेकिन मैं पहले ही अभ्यास से गुजर चुका था, और यह एक कामकाजी स्क्रिप्ट है, जो यथोचित दस्तावेज है; यह बिंदु अकेले कुछ के लिए ब्याज की हो सकती है .. (टिप्पणियों के साथ sed!)

यह लिपि रिक्त लाइनों को रिक्त मानती है भले ही उनमें व्हॉट्सएप हो।
पाठ में एकाधिक स्थान एक ही स्थान के लिए संघनित होते हैं।
अनुगामी व्हाट्सएप को पाठ लाइनों से हटा दिया जाता है। लगातार खाली लाइनें एक ही लाइन से ढह जाती हैं। स्क्रिप्ट ऊपर और नीचे खाली लाइनों को बरकरार रखती है।

सबसे तुच्छ लिपियों से अधिक कुछ के लिए, एक संरचित रूप में, एक अलग स्क्रिप्ट फ़ाइल के रूप में, सीड को बहुत आसानी से लिखा जा सकता है। यहाँ एक ऐसा उदाहरण है।

विस्तारित रेगेक्स सिंटैक्स
कॉल का उपयोग करना : $ sed -rf स्क्रिप्ट पाठ-फ़ाइल

  :first-empty-line
  #================
  /^[[:space:]]*$/ { # if pattern-space is empty...
      $q  # last line # flush-quit 
      n   # pattern-flush=nextline-continue

      :subsequent-empty-line
      #=====================
      /^[[:space:]]*$/ { # if pattern-space is empty...
          $d        # last line # pattern-delete-cycle
          N         # pattern+=nl+nextline
          s/.*\n//  # scrap the leading 'blank' line
          t subsequent-empty-line # branch-on-substitute
      }
  }

  :text-line
  #=========
  $q                       # last line # flush-quit 
  s/^(.*)[[:space:]]*/\1/  # trim trailing whitespace
  s/ +/ /g                 # condense mulltiple spaces
  N                        # pattern+=nl+nextline
  /^.*\n[[:space:]]*$/ { # if newly-read line is blank 
      P          # pattern-first-line-print
      s/^.*\n//  # remove the leading 'text' line
      t first-empty-line   # branch-on-substitute
  }
  # read line is text
  s/\n/ /      # replace \n with a space
  t text-line  # branch-on-substitute

नोट: flushटिप्पणियों में, का अर्थ है: सेड के आंतरिक स्टडआउट हैंडलिंग के लिए पैटर्न-स्पेस भेजें। इसका मतलब यह नहीं है कि स्टडआउट के लिए एक निश्चित प्रिंट है। आउटपुट सेड के -nविकल्प पर निर्भर है। जैसे। qआदेश साधन फ्लश और छोड़ने ... इन दोनों के टुकड़े की तुलना करें: echo x |sed -e qप्रिंट x, echo x |sed -ne qप्रिंट कुछ भी नहीं, का उपयोग करते हुए, जबकि pआदेश 'एक्स', मुद्रित होगा दो बार या एक बार के आधार पर -nविकल्प।


अच्छी टिप्पणियों के लिए +1। मैंने बहुत सारे कार्यक्रम देखे हैं जिनमें कोई टिप्पणी नहीं है।
डेविड कैरी

4

यहाँ अभी तक एक और sedसमाधान है जो सभी लाइनों को sed'' s स्पेस '' में समेटता है ताकि हमें एक लंबी स्ट्रिंग मिले जो आखिरकार पैटर्न मिलान के लिए "पैटर्न स्पेस" में कॉपी हो जाए।

जैसा कि नई सूचियों को sed"एस" पैटर्न स्पेस में अंतिम लंबी स्ट्रिंग में संरक्षित किया जाएगा , डबल लाइनब्रेक के संदर्भ में खाली लाइनों को [^\n]\n\n[^\n]मिलान और संशोधित किया जा सकता है [^\n]\n[^\n]

अधिक जानकारी के लिए, उदाहरण के लिए, sed और मल्टी-लाइन खोज और बदलें

text='
line 1

line 2
line 3





line 4


line     5



line 6
line 7

line 8
'

# FreeBSD sed
# first sed deletes first / last line if empty and squeezes multiple spaces
printf '%s' "$text" |
sed -e '1{/^$/d;}' -e '${/^$/d;}' -e '/[[:space:]]\{2,\}/s// /g' | 
sed -n -e '1h;1!H;${;g;/\([^[:cntrl:]]\)\n\n\([^[:cntrl:]]\)/s//\1\
\2/g;p;}' |
nl -b a


# GNU sed
# alternative using ...;x;... instead of ...;g;...
# cf. man sed | less -p '\]x'
printf '%s' "$text" |
gsed -e '1{/^$/d;}' -e '${/^$/d;}' -e '/[[:space:]]\{2,\}/s// /g' | 
gsed -E -n '1h;1!H;${;x;/([^\n])\n\n([^\n])/s//\1\
\2/g;p;}' | 
nl -b a


# remove all the single linebreaks but leave the double linebreaks intact
printf '%s' "$text" | 
   sed -n -e '1h;1!H;${;g;/\([^[:cntrl:]]\)\n\([^[:cntrl:]]\)/s//\1 \2/g;p;}' | 
   nl -b a

3

यह पुराना स्कूल हो सकता है:

(echo ".pl 1" ; echo ".ll 80" ; echo ".ad l" ; cat your_file) | nroff

यह आपके टेक्स्ट को लेफ्ट एलाइन ( .ad l), 80 की लाइन लेंथ ( ) के साथ आउटपुट करेगा .ll 80। पृष्ठ की लंबाई का विकल्प ( .pl) पाठ प्रोसेसर को पृष्ठ की लंबाई 1 के लिए पेज पैडिंग करने के लिए कहता है, इसलिए कोई पेज पैडिंग नहीं है।

यदि आप एक पंक्ति में अपने सभी पैराग्राफ चाहते हैं, तो आप इसके लिए बड़ी संख्या का उपयोग कर सकते हैं .ll:

(echo ".pl 1" ; echo ".ll 1000000" ; echo ".ad l" ; cat your_file) | nroff

अधिक प्रारूपण विकल्पों के लिए मैन 7 ग्रॉफ


1

Emacs में, मैं कभी-कभी इसका उपयोग करता हूं regex:

^J\([^^J]\) -> \1

माध्यम:

हर उस नई पंक्ति को बदलें, जो किसी ऐसी चीज के साथ है, जो केवल एक चीज के साथ एक नई रेखा नहीं है, जो उस नई पंक्ति का अनुसरण करती है, जिस तरह से मैं एक पैराग्राफ के भीतर सभी न्यूलाइन्स से छुटकारा पा लेता हूं, लेकिन पैराग्राफ (डबल-न्यूलाइन्स) रखता हूं


0

यह पता चलता है कि auto-fill-modeएमएसीएस मेरे साधारण उपयोग के मामलों के लिए बहुत अच्छा काम करता है M-q...


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