শুধুমাত্র একক নিউলাইনগুলি প্রতিস্থাপনের জন্য আরও ভাল উপায় থাকতে হবে?


27

আমি বাক্য অনুযায়ী একটি লাইন লেখার অভ্যাস করছি কারণ আমি সাধারণত ল্যাটেক্সে জিনিসগুলি সংকলন করি, বা অন্য কোনও ফর্ম্যাটে লিখছি যেখানে লাইন ব্রেকগুলি উপেক্ষা করা হয়। নতুন অনুচ্ছেদের শুরুটি নির্দেশ করতে আমি একটি ফাঁকা রেখা ব্যবহার করি।

এখন, আমার কাছে এই স্টাইলে একটি ফাইল লেখা আছে যা আমি কেবল সরল পাঠ্য হিসাবে প্রেরণ করতে চাই। আমি সমস্ত একক লাইনব্রেকগুলি সরিয়ে দিতে চাই তবে ডাবল লাইনব্রেকগুলি অক্ষত রেখেছি। আমি এই কাজটি করেছি:

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

এটি খালি রেখাগুলিকে কিছু পাঠ্যের সাথে প্রতিস্থাপন করে যা আমি আত্মবিশ্বাস করি যে ফাইলটিতে উপস্থিত হবে না: NEWLINEএবং তারপরে এটি অজকের সাথে সমস্ত লাইন বিরতি থেকে মুক্তি পেয়ে যায় (আমি কোনও ওয়েবসাইটের মধ্যে সেই কৌশলটি পেয়েছি) এবং তারপরে এটি NEWLINEপ্রয়োজনীয় দুটি লাইনব্রেকগুলির সাথে এসকে প্রতিস্থাপন করে ।

এটি দেখতে খুব সহজ একটি সহজ উপায় করার মতো দীর্ঘ ঘূর্ণিত উপায়। একটি সহজ উপায় আছে কি? এছাড়াও, যদি একক স্পেসগুলির সাথে একাধিক স্পেস (যা কখনও কখনও কোনও কারণে ক্রাইপ হয়) প্রতিস্থাপন করার উপায় থাকে তবে এটিও ভাল।

আমি ইম্যাক্স ব্যবহার করি, সুতরাং যদি কিছু ইমাস সুনির্দিষ্ট কৌশল থাকে তবে তা ভাল, তবে আমি বরং খাঁটি সেড বা খাঁটি অ্যাজক সংস্করণটি দেখতে পাচ্ছি।


আপনি প্রথম সেড-কমান্ডে ^ not নয়, meant meant বোঝাচ্ছেন।
ব্যবহারকারী অজানা

@ ব্যবহারকারী হ্যাঁ, হ্যাঁ আমি করেছি।
Seamus

সমস্ত লাইন ব্রেক অপসারণ করার জন্য একটি সহজ উপায়: tr -d "\n"
jfg956

উত্তর:


18

আপনি এই মত জঘন্য ব্যবহার করতে পারেন:

$ 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এটি /^$/স্ট্রিং ম্যাচের মতো কাজ করছে এবং এটি কি ঠিক?
Seamus

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

যদি তা হয় তবে একটি সম্ভাব্য সমাধান হ'ল নতুন লাইনের সমস্ত একক ঘটনাগুলি দূর করা।

পার্ল-এ, এটি দেখার এক উপায় হ'ল দর্শনীয় দাবী:

$ perl -0777 -i -pe 's/\n(?=[^\n])//g' test
  • -0777পতাকা কার্যকরভাবে একটি একক স্ট্রিং মধ্যে পুরো ফাইল slurps
  • -p পার্লকে এটি স্ট্রিংটি ডিফল্টরূপে মুদ্রণ করতে বলে
  • -i ইন-প্লেস এডিটিং নির্দিষ্ট করে
  • গ্লোবাল ম্যাচিং নিশ্চিত করে যে সমস্ত একক নতুন লাইনের উপস্থিতি মোকাবেলা করা হয়েছে

এটির একটি সমস্যা হ'ল বাক্যগুলির মধ্যে কোনও ফাঁকা স্থান নেই।
স্টিভেন ডি

6

(একটি প্রাচীন প্রশ্ন পুনরুদ্ধার)

অনুচ্ছেদ পুনরায় ফর্ম্যাট করা - এটি ঠিক কী fmtএবং parএর জন্য বলে মনে হচ্ছে । আপনার মত (এবং অনেকগুলি প্রোগ্রামও পছন্দ করে) তারা অনুচ্ছেদের সীমানাকে এক (বা আরও) ফাঁকা লাইন হিসাবে সংজ্ঞায়িত করে। এর মধ্যে একটির মাধ্যমে আপনার পাঠ্য পাইপ করার চেষ্টা করুন।

fmt এটি একটি স্ট্যান্ডার্ড ইউনিক্স ইউটিলিটি এবং জিএনইউ কোরিটিলগুলিতে পাওয়া যাবে।

parfmtঅ্যাডাম এম কস্টেলো রচিত একটি বিস্তৃত বর্ধিত যা http://www.nicemice.net/par/ এ পাওয়া যাবে (এটি ডেবিয়ান সহ বেশ কয়েকটি বিতরণের জন্যও প্যাকেজ করা হয়েছে - আমি এটিকে 1996 সালের জানুয়ারীতে ডিবিয়ানদের জন্য প্যাকেজ করেছি, যদিও এখন পিকেজির জন্য নতুন রক্ষণাবেক্ষণকারী রয়েছে))।


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

sedHপুরানো জায়গাতে যে কোনও লাইন যুক্ত হবে যাতে কমপক্ষে একটি একক অক্ষর থাকে। এটি অবিলম্বে এর মধ্যে dসম্ভবত শেষ ব্যতীত সমস্ত একাদশ। শুধুমাত্র লাইন যা থাকতে পারে ঐ খালি হয়, এবং এটা এই লাইনের উপর যখন sedxপরিবর্তন হোল্ড এবং প্যাটার্ন স্পেস এবং সব সঞ্চিত মুছে ফেলে \newline অক্ষর।

আপনি যদি কেবলমাত্র <ট্যাবস> বা <স্পেসেস> সমেত লাইনগুলি ফাঁকা হিসাবে বিবেচনা করতে চান তবে /./উপরের ঠিকানাটি প্রতিস্থাপন করুন /[^[:blank:]]/। স্পেসগুলি নিখরচায় করতে:

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

5

গিলসের পার্ল এবং অ্যাড অব কমপ্যাক্ট উদাহরণগুলি দেখার পরে, আমি এটি পোস্ট করতে নারাজ, তবে আমি ইতিমধ্যে অনুশীলনের মধ্য দিয়ে গিয়েছিলাম, এবং এটি একটি কার্যকরী স্ক্রিপ্ট, যা যুক্তিযুক্ত নথিভুক্ত; এই পয়েন্টটি একা কারও আগ্রহী হতে পারে .. (মন্তব্য সহ!)

এই স্ক্রিপ্টটি ফাঁকা রেখাগুলি ফাঁকা হিসাবে বিবেচনা করে এমনকি তাতে শ্বেত স্পেস থাকে।
পাঠ্যের একাধিক স্পেস একক স্পেসে ঘনীভূত হয়।
ট্রেলিং হোয়াইটস্পেস পাঠ্য লাইন থেকে সরানো হয়েছে। একটানা ফাঁকা লাইনগুলি একক লাইনে ধসে গেছে। স্ক্রিপ্টটি উপরের এবং নীচের ফাঁকা রেখাগুলি অক্ষত।

সর্বাধিক তুচ্ছ স্ক্রিপ্টগুলির চেয়ে বেশি যে কোনও কিছুর জন্য, সেড একটি পৃথক স্ক্রিপ্ট ফাইল হিসাবে কাঠামোগত আকারে অনেক বেশি সহজেই লেখা যায়। এখানে যেমন একটি উদাহরণ।

এক্সটেন্ডেড রেজেক্স সিনট্যাক্স
কল ব্যবহার করে : $ সেড-আরএফ স্ক্রিপ্ট টেক্সট-ফাইল

  :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মন্তব্যে এর অর্থ: শেডের অভ্যন্তরীণ স্টাডআউট হ্যান্ডলিংয়ের জন্য প্যাটার্ন-স্পেসটি প্রেরণ করুন। এটি stdout একটি নির্দিষ্ট মুদ্রণ মানে না। আউটপুট সেড -nবিকল্পের উপর নির্ভর করে । যেমন। qকমান্ড মানে ফ্লাশ এবং প্রস্থান ... এই দুটি স্নিপেট তুলনা করুন: echo x |sed -e qকপি করে প্রিন্ট x, echo x |sed -ne qকপি করে প্রিন্ট কিছুই ব্যবহার যেহেতু pকমান্ড 'X, প্রিন্ট হবে দুইবার বা একবার উপর নির্ভর করে -nবিকল্প।


ভাল মন্তব্যের জন্য +1। আমি কোন মন্তব্য না করে অনেকগুলি প্রোগ্রাম দেখেছি।
ডেভিড ক্যারি

4

এখানে আরও একটি sedসমাধান রয়েছে যা সমস্ত লাইনকে sed"হোল্ড স্পেস" এর সাথে সংযুক্ত করে যাতে আমরা একটি দীর্ঘ স্ট্রিং পাই যা অবশেষে প্যাটার্ন মেলানোর জন্য "প্যাটার্ন স্পেস" এ অনুলিপি করা হয়।

চূড়ান্ত দীর্ঘ স্ট্রিংয়ের sed"প্যাটার্ন স্পেস" এ নতুন লাইনের সংরক্ষণ করা হবে বলে ডাবল লাইনব্রেকের ক্ষেত্রে খালি লাইনগুলি মেলাতে [^\n]\n\n[^\n]এবং সংশোধন করতে পারে [^\n]\n[^\n]

আরও তথ্যের জন্য দেখুন, উদাহরণস্বরূপ, সেড এবং মাল্টি-লাইন অনুসন্ধান এবং প্রতিস্থাপন

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

ইমাসে, আমি মাঝে মাঝে এটি ব্যবহার করি regex:

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

মাধ্যম:

প্রত্যেকটি নিউলাইন প্রতিস্থাপন করুন যা এমন কিছু দ্বারা অনুসরণ করা হবে যা কেবলমাত্র জিনিসটির সাথে একটি নতুন লাইন নয়, যা নিউলাইনটি অনুসরণ করেছে এইভাবে আমি অনুচ্ছেদে সমস্ত নিউলাইনগুলি থেকে মুক্তি পেয়েছি তবে অনুচ্ছেদে রাখি (ডাবল-নিউলাইন)


0

দেখা যাচ্ছে যে auto-fill-mode, ইম্যাকগুলি আমার সাধারণ ব্যবহারের ক্ষেত্রে কেবলমাত্র M-q...


auto-fill-modeআপনি কী মেজর মোডে সক্রিয় আছেন তার উপর কি নির্ভর করে তার বিশদ ।
dmckee
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.