আমি ভুল জায়গায় ভাঙা লাইনগুলি কীভাবে ঠিক করতে পারি?


11

আমার পাঠ্য ফাইলটি এমন দেখাচ্ছে:

This is one
sentence that is broken.
However this is a good one.
And this
one is
somehow, broken into
many.

আমি যে কোনও লাইনের পিছনে ছোট হাতের অক্ষর দিয়ে শুরু হওয়া লাইন অনুসরণ করে চলার জন্য নতুন লাইনের চরিত্রটি সরিয়ে দিতে চাই।

সুতরাং এটি হওয়া উচিত:

This is one sentence that is broken.
However this is a good one.
And this one is somehow, broken into many.

কিভাবে আমি এটি করতে পারব?

সম্পাদনা করুন: এখানে কিছু সত্যই ভাল উত্তর রয়েছে তবে আমি প্রথম যেটি কাজ করেছিল এবং তা প্রাচীনতম তা গ্রহণ করতে বেছে নিয়েছি । সবাইকে অনেক অনেক ধন্যবাদ!


1
ক্ষীর? সমস্যাটি হ'ল আপনি যথাযথ বাক্য ভাঙ্গার নিয়মগুলি সত্যই বর্ণনা করেন না। আপনি কি একক লাইনে বাক্য-বিরামচিহ্নগুলি সহ এবং সমস্ত কিছু স্থাপন করতে চান? তবে যদি আপনার একটি দীর্ঘ বাক্য থাকে এবং এটি আপনার প্রদর্শন উইন্ডোর প্রান্তটি বন্ধ করে দেয়?
জামেস্কেফ

1
আমি ভাবছি আপনি কী সমাধান করার চেষ্টা করছেন? সম্ভবত আপনি মার্কডাউন ফর্ম্যাটিং ব্যবহার করা উচিত?
ওয়াইল্ডকার্ড

@ জেফ শ্যাচলার এই অনুস্মারকটির জন্য ধন্যবাদ! আমি একরকম মিস করেছি :)

উত্তর:


7

চেষ্টা

awk '$NF !~ /\.$/ { printf "%s ",$0 ; next ; } {print;}' file

কোথায়

  • $NF !~ /\.$/ মিলের লাইন যেখানে শেষ উপাদানটি বিন্দু দিয়ে শেষ হয় না,
  • { printf "%s ",$0 এই লাইনটি ট্রেলিং স্পেস দিয়ে মুদ্রণ করুন এবং কোনও লাইন ফিড নেই,
  • next ; } পরের লাইনে আনুন,
  • {print;} এবং এটি মুদ্রণ।

আমি নিশ্চিত একটি sedবিকল্প থাকবে।

দ্রষ্টব্য: এটি কোনও বিন্দুতে লাইন শেষের সাথে কাজ করবে, তবে বড় আকারের অক্ষর দিয়ে শুরু হওয়া বাক্যে শর্তটি মার্জ হবে না। স্টাফেন চেজেলাসের উত্তর দেখুন।


আপনি যদি চতুর পছন্দ করেন (অনেকেই করেন না)awk 'ORS=$NF~/\.$/?"\n":" "'
dave_thompson_085

10

সহ awk:

awk -v ORS= '{print (NR == 1 ? "" : /^[[:lower:]]/ ? " " : RS) $0}
             END {if (NR) print RS}'

এটি হ'ল প্রতিটি লাইনে রেকর্ড বিভাজক যুক্ত করবেন না (ওআরএস ফাঁকা)। কিন্তু পূর্বে লিখুন বর্তমান লাইন সামনে রেকর্ড বিভাজক না হলে প্রথম লাইন ও বর্তমান লাইনে একটি ছোট হাতের অক্ষর দিয়ে শুরু হয় না। অন্যথায় প্রথম লাইন বাদে পরিবর্তে একটি স্পেস অক্ষর তৈরি করুন end


আমি এটি চালানোর সময় কয়েকটি জোড় শব্দগুলি সংমিশ্রিত হয়। উদাহরণস্বরূপ And thisone issomehow, broken intomany.আমি জানি না awkতবে লাইনগুলি <space>ছাড়াও যুক্ত হওয়া উচিত RS? নাকি এই ব্যবহারকারীর ত্রুটি?
বি লেয়ার

@ ব্লায়ার, ভালভাবে চিহ্নিত, ধন্যবাদ। এখনই ঠিক করা উচিত।
স্টাফেন চেজেলাস

সমস্যা নেই. যদিও 11 টি উপস্থাপকটি কোথা থেকে এসেছে তা ভাবছেন। লোকেরা আপনাকে ধরে রাখতে পারে যে আপনি সর্বদা ঠিক আছেন nice ;)
বি লেয়ার

4

পার্ল ইন:

#!/usr/bin/perl -w
use strict;
my $input = join("", <>);
$input =~ s/\n([a-z])/ $1/g;
print $input;

প্রযুক্তিগতভাবে আপনি "নতুন এবং তারপরে লোয়ার-কেস লেটার" এর সাথে "স্পেস এবং-যে-লোয়ার-কেস-লেটার" দিয়ে প্রতিস্থাপন করতে চেয়েছিলেন, যা উপরের পার্ল স্ক্রিপ্টের মূল কাজটি করে:

  1. একটি স্ট্রিং ইনপুট পড়ুন input
  2. inputঅনুসন্ধান এবং প্রতিস্থাপন অপারেশনের ফলাফল হতে ভেরিয়েবল আপডেট করুন ।
  3. নতুন মান মুদ্রণ করুন।

1
ভাল একটা!! ওয়ান-লাইনে অনুবাদিত, perl -0777 -pe 's/\n([a-z])/ $1/g'এবং একইভাবে জিএনইউ সেডের সাথেও করা যেতে পারে sed -zE 's/\n([a-z])/ \1/g'(ধরে নিই যে ইনপুট নাল অক্ষর নেই)
সন্দীপ

3
@ সন্দীপ, বা perl -Mopen=locale -0777 -pe 's/\n(?=[[:lower:]])/ /g'এটি ASCII অক্ষরের মধ্যে সীমাবদ্ধ না রাখার জন্য।
স্টাফেন চেজেলাস

4

সঙ্গে sedআপনি একটি ব্যবহার করতে পারে N;P;Dচক্র (তাই সবসময় হিসেবে প্যাটার্ন মহাকাশে দুই লাইন আছে এবং যদি সম্পর্কে newline পর প্রথম অক্ষর ছোট হাতের অক্ষরে তারপর একটি স্পেস দিয়ে সম্পর্কে newline প্রতিস্থাপন) এবং একটি tহল - যে ভাবে প্রতিটি পর substitution আপনি চক্র পুনরায় আরম্ভ করুন:

sed -e :t -e '$!N;/\n[[:lower:]]/s/\n/ /;tt' -e 'P;D' infile

1
আমি মনে করি আমি এখানে কী চলছে তা দেখতে পাচ্ছি, তবে একটি বর্ধিত উত্তর আমাদের মধ্যে যারা খুব বেশি সময় সেড লুপ এবং প্যাটার্ন স্পেস ব্যবহার করে না তাদের সহায়তা করবে।
জো

@ জো - "প্যাটার্নের স্থানটি প্রায়শই ব্যবহার না করা " বলতে কী বোঝ ? সেখানে প্রায় সমস্ত অপারেশন হয় - হোল্ড স্পেসটি একটি "স্টোরেজ স্পেস" - সেখানে থাকা অবস্থায় আপনি ডেটা দিয়ে কিছুই করতে পারবেন না। যাইহোক, আমি এখানে একটি N;P;Dচক্র কীভাবে কাজ করে সে সম্পর্কে আমি বিশদভাবে ব্যাখ্যা করেছি যাতে আমি আর এটির উপরে যাব না। এখানে পার্থক্যটি হ'ল t- কিছু প্রতিস্থাপন করা হয়েছিল কিনা তা পরীক্ষা করা - যদি পরীক্ষাটি সফল হয় তবে আমরা স্ক্রিপ্টের শীর্ষে শাখা করি, অন্যথায় এর অর্থ কিছুই প্রতিস্থাপন করা হয়নি এবং P;Dসম্পাদন করা হয়। এটি এখনও অস্পষ্ট কিনা তা আমাকে জানান।
don_crissti

3

ব্যবহার sedএবং fmt:

$ sed -e '1n; s/^[[:upper:]]/\n&/' input.txt | fmt
This is one sentence that is broken.

However this is a good one.

And this one is somehow, broken into many.

সেড স্ক্রিপ্টটি প্রতিটি লাইনের আগে একটি নতুন লাইন সন্নিবেশ করে যা মূল অক্ষর দিয়ে শুরু হয় (ইনপুটটির প্রথম প্রথম লাইন বাদে)। sedএর fmtফলাফলগুলি অনুচ্ছেদে পুনরায় ফর্ম্যাট করতে পাইপ দেওয়া হয়।

parএটি ইনস্টল করা থাকলে বিকল্পভাবে ব্যবহার করুন use এটি আরেকটি অনুচ্ছেদে পুনর্নির্মাণকারী, তবে আরও fmtঅনেকগুলি বৈশিষ্ট্য এবং বিকল্পের সাথে তুলনায় অনেক বেশি সক্ষম ।

মনে রাখবেন যে প্রতিটি অনুচ্ছেদের মধ্যে একটি ফাঁকা রেখা থাকবে। অনুচ্ছেদগুলি একে অপরের থেকে কমপক্ষে একটি ফাঁকা রেখার দ্বারা পৃথক করা উচিত । ফাঁকা রেখা ছাড়াই, আপনার সম্পূর্ণ ইনপুট নমুনাটি একটি একক বহু-বাক্য অনুচ্ছেদের হিসাবে পুনরায় ফর্ম্যাট করা হয়েছে, যেমন:

$ fmt input.txt
This is one sentence that is broken.  However this is a good one.
And this one is somehow, broken into many.

পুনরায় ফর্ম্যাট করার পরে যদি ফাঁকা লাইনগুলি সরিয়ে ফেলতে হয় তবে এটির মাধ্যমে sedআবার পাইপ করুন - তবে এটি আসল ইনপুটটিতে থাকা সমস্ত ফাঁকা রেখা সরিয়ে ফেলবে। যেমন

$ sed -e '1n; s/^[[:upper:]]/\n&/' input.txt | fmt | sed -e '/^$/d'
This is one sentence that is broken.
However this is a good one.
And this one is somehow, broken into many.

3

আপনি এটি করার আরেকটি উপায় হ'ল:

perl -lpe '$\ = /\.$/ ? $/ : $"' data

যার মধ্যে: $\=> ORS, $/=> IRS= \n, $"=space

perl -pe '$_ .= <>, eof or redo if s/[^.]\K\n/ /' data

sed -e '
   :a
      /\.$/!N
      s/\n/ /
   ta
' data

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