সেড কি 'ডাবল' নিউলাইন চরিত্রগুলি মুছে ফেলতে পারে?


25

প্রচুর খালি লাইন সহ আমার একটি ডকুমেন্ট আছে।

2 বা ততোধিক একসাথে থাকাকালীন আমি কীভাবে এগুলি সরিয়ে ফেলতে পারি।

আমি sed "s/\n\n//"ফাইল চেষ্টা করেছিলাম কিন্তু এটি কার্যকর হয়নি। কোনও ত্রুটি নেই।


3
আপনি যদি সমস্ত ফাঁকা লাইন মুছে ফেলতে না চান তবে আমি কেবল আপনাকে সঠিকভাবে পড়ছি তবে তা কেবল দুটি বা তার বেশি হলে। তাহলে একক ফাঁকা লাইন নয়?
রানিয়াম

1
এবং যদি এটি দুটি বা ততোধিক লাইনগুলি সত্যিই সবগুলি মুছে ফেলা হয় বা কেবল একটি ছাড়া সমস্ত?
হউক লেগেইং

উত্তর:


42

খালি লাইনগুলি সরাতে:

sed  '/^$/d'

sedলাইন ভিত্তিক, সুতরাং "2 বা আরও একটি নির্দিষ্ট বাইটের আরও বেশি" বিবেচনা করে সেই বাইটটি যখন নতুন লাইন হয় তখন বাদ দিয়ে কাজ করে । তারপরে আপনাকে এমন কিছু চিন্তা করতে হবে যা পুরো লাইনের জন্য কাজ করে।


অবশ্যই! সাধারণ কমনীয়তার জন্য +1।
terdon

2
sedতার "প্যাটার্ন স্পেস" / "হোল্ড স্পেস" বৈশিষ্ট্যটির মাধ্যমে বেশ কয়েকটি লাইন পরিচালনা করতে সক্ষম। তবে আমি মনে করি এটি খুব জটিল। ;-)
হউক লেগেইং

যদি ফাইলের প্রথম অক্ষরটি একটি নতুন লাইন থাকে তবে এটি পছন্দসই হিসাবে কাজ করবে না।
ক্রিস ডাউন

1
এটা কাজ যখন প্রথম অক্ষর একটি newline হয় (যদি যে সত্যিই প্রয়োজন নেই) তৈরি করতে হলে, তারপর আপনি একটি নেতিবাচক ঠিকানা দিয়ে কমান্ড ঘিরা করতে 1!(লাইন 1 ছাড়া সমস্ত মেলে), এইভাবে: sed '1!{/^$/d'}
টবি স্পিড

1
@ অ্যারোনফ্রেঙ্ক - হ্যাঁ, তবে এটি লিনাক্স শেলগুলি কীভাবে '>' পুনঃনির্দেশের সাথে আচরণ করে তার একটি দিক। শেলটি কমান্ড লাইনের দিকে তাকাবে, কোনও ফাইলকে স্টাডাউটের '>' পুনঃনির্দেশ দেখতে পাবে, সেই ফাইলটি তৈরি করে এবং তারপরেই চালিত হয় sed। একটি ফাইল তৈরি করা মূলত একই নামের কোনও বিদ্যমান ফাইল মুছে ফেলবে। sed '/^&/d' file.txt > otherfile.txtকাজ করবে.
ব্রুস এডিগার

24

দরকার নেই sedgrepকরব:

grep .

(এটি grep, এসপিসি, বিন্দু, এটি কমপক্ষে একটি অক্ষর সমন্বিত কোনও লাইনের সাথে মেলে)।

এছাড়াও আছে:

tr -s '\n'

(নিউলাইন চরিত্রগুলির যে কোনও ক্রমটিকে একের মধ্যে ছড়িয়ে দিন)।

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


2
ফাইলটির প্রথম চরিত্রটি যদি নতুন লাইন হয় তবে এটি পছন্দসইভাবে
ক্রিস ডাউন

7

sedএটির জন্য সেরা সরঞ্জাম নয়, যেহেতু এটি লাইন ভিত্তিক এবং লাইন \n-এর শেষের চরিত্র হিসাবে আচরণ করে এটি জটিল হয়ে ওঠে।ব্রুস এডিগারের উত্তরটি দেখে কাজটির sedজন্য উপযুক্ত সরঞ্জাম হতে পারে, তবুও, এখানে আরও কিছু বিকল্প রয়েছে:

  1. পার্ল

    perl -ne 'print if /./' file.txt
    

    অথবা

    perl -pe '$/=""; s/\n+/\n/;' file.txt 
    

    @রুখকে ধন্যবাদ যিনি আমাকে যেতে এবং এটি পড়তে বাধ্য করেছেন :

    $ /

    ইনপুট রেকর্ড পৃথককারী, ডিফল্টরূপে নতুন লাইন। এটি "লাইন" কী তা পার্লের ধারণাকে প্রভাবিত করে। শূন্য পংক্তিতে শূন্য রেখাগুলি টার্মিনেটর হিসাবে চিকিত্সা করা সহ শূন্য রেখাগুলির সাথে শূন্য পংক্তির সাথে শূন্য পংক্তিতে সেট করা (খালি লাইনে কোনও ফাঁকা জায়গা বা ট্যাব থাকতে পারে না) জোর করে আর-এর-এর আরএস ভেরিয়েবলের মতো কাজ করে। আপনি একটি মাল্টি-ক্যারেক্টার টার্মিনেটরের সাথে মেলে একটি মাল্টি-ক্যারেক্টার স্ট্রিং এ সেট করতে পারেন, বা ফাইলের শেষের সাথে পড়তে অপরিশোধিত করতে পারেন। "\ N \ n" এ সেট করা মানে "" এ সেট করার চেয়ে কিছুটা আলাদা ", যদি ফাইলটিতে পরপর খালি লাইন থাকে। "" এ সেট করা দু'বার বা একাধিক ক্রমাগত খালি রেখাকে একক ফাঁকা রেখা হিসাবে বিবেচনা করবে। "\ N \ n" তে সেট করা অন্ধভাবে ধরে নেবে যে পরবর্তী ইনপুট অক্ষরটি নতুন অনুচ্ছেদে হলেও পরবর্তী অনুচ্ছেদের অন্তর্ভুক্ত।

  2. জবুথবু ব্যক্তি / awk

    awk '$1' file.txt
    

    এটি পোস্ট করা উদাহরণটির জন্য কাজ করবে তবে @ স্টেফেন চ্যাজেলাস যেমন উল্লেখ করেছেন, এটি এমন লাইনগুলিও মুছে ফেলবে যার প্রথম ক্ষেত্রটি "দেখতে" দেখাচ্ছে 0। এটি আরও দৃust়:

    awk NF file.txt
    

পার্লের জন্য, perl -pe 's/\n+/\n/ file.txtকরবেন, ইনপুট রেকর্ড বিভাজক এই ব্যবহারের জন্য অপ্রাসঙ্গিক।
ভোনব্র্যান্ড

@ ভনব্র্যান্ড নং, perl -peবা perl -neলাইনে কাজ লাইন। \n+কখনও মিলবে না কারণ এটি কেবলমাত্র একটি লাইনে প্রয়োগ করা হয়। এটা কেন আপনি হয় সেট করতে হবে এর $/বা ব্যবহার -0TI ফাইল পুরো গবগব করে খাওয়া: perl -0pe 's/\n+/\n/' file
টেরডন

6

আপনি কি অপসারণ মানে? সদৃশ সরিয়ে ফেলুন (একের কাছে অনেকগুলি ফাঁকা রেখা) বা সমস্ত সরাবেন?

আপনি যদি সদৃশ অপসারণ করতে চান তবে সেড ব্যবহারের পদ্ধতিটি এখানে:

sed '$!N; /^\(.*\)\n\1$/!P; D'

এটি uniqকমান্ড অনুকরণ করে ।

সেরা পছন্দটি ব্যবহার করা হচ্ছে awk:

awk NF <filename>

এর sedঅংশটি দুর্দান্ত কাজ করে! এটি সেরা উত্তর হিসাবে প্রস্তাব দেওয়া হচ্ছে।
আকিতো

2

এই উত্তরগুলির বেশিরভাগটির জন্য প্রথমে ট্রেলিং হোয়াইটস্পেস অপসারণ করা দরকার। দ্বিগুণ হয়ে যাওয়া নিউলাইনগুলি সরানো সমস্ত ফাঁকা রেখা সরিয়ে দেয়। (এই সম্পর্কে চিন্তা).

আক্ষরিক অর্থে ব্যাখ্যা করা ওপি "যদি কোনও পুনরাবৃত্তি ফাঁকা লাইন থাকে তবে কোনও ফাইল থেকে সমস্ত ফাঁকা রেখা সরানো" চায়।

সাধারণ ব্যবহারকারী "কেবলমাত্র নকল ফাঁকা লাইনগুলি মুছে ফেলতে" চান।

এটি করার জন্য, প্রথমে হোয়াইটপেসের পিছনে স্ট্রিপ করুন, এবং বিড়াল-টি হলেও পাইপ

sed  s/[[:space:]]*$// | cat -s

এবং তবুও এটি কোনও অতিরিক্ত অগ্রণী বা পিছনের ফাঁকা রেখাটি সরিয়ে ফেলবে না।


ডাউনভোটড, তবে এটি কি স্পষ্টভাবে কাজ করে? মন্তব্য নেই ?
mckenzm

1
আমি আপনাকে উত্সাহিত করেছি ... আপনি জানেন ... প্রশ্নের উত্তর দিয়েছিলেন। =) আমি বিশ্বাস করতে পারি না ব্রুস এডিগার এর প্রতিক্রিয়া উজাড় হয়ে গেছে যখন এটি প্রতিটি ফাঁকা রেখা মুছে দেয় । যদি কেউ ডুপ্লিকেট করা ফাঁকা লাইনগুলি কীভাবে সরিয়ে ফেলতে হয় সে সম্পর্কে জিজ্ঞাসা করেন, তবে এমন কোনও দৃশ্য আমি কল্পনা করতে পারি না যেখানে সমস্ত ফাঁকা লাইন মুছে ফেলা একটি গ্রহণযোগ্য সমাধান হয়ে উঠবে। কিন্তু যাই হোক না কেন. সেডের
টড ওয়ালটন

2

আপনি যদি খালি লাইনের কোনও প্রদত্ত অনুক্রমের জন্য একটি ফাঁকা রেখা রাখতে চান তবে:

sed -e '/./b' -e :n -e 'N;s/\n$//;tn'

1
এটি হ'ল একমাত্র উত্তর (পাশাপাশি cat -s) যা আমি বুঝতে পেরেছি ঠিক ততই প্রশ্নটি জিজ্ঞাসা করেছিল accomp (এবং এটির চেয়ে ভাল cat -sকারণ আমি এটি ব্যবহার sed -iকরতে পারি))
ম্যাথু

-2

উভয়কে আপনার ক্ষেত্র বিভাজক হিসাবে sed -e 's#\\n\\n#\\n#g' input.file > output.fileব্যবহার করার চেষ্টা করুন /এবং আপনার রেজেক্সের অংশ সমস্যা হতে পারে।


2
সিকোয়েন্সে ডাবল এবং ট্রিপল নিউলাইন যুক্ত এমন একটি ফাইল দিয়ে সবেমাত্র এটিকে ঘূর্ণি দিয়েছিলাম। আমার পক্ষে মোটেও কাজ করে না।
সিনট্যাক্সেরর

-3

এই আদেশটি ব্যবহার করুন:

tr -s '\r' '\n'

হ্যাঁ, তাদের উত্তর আমার পক্ষে কার্যকর হয়নি।
মায়ো

5
আফাইক এই উত্তরটি ভুল। আমি এটি মুছে ফেলার জন্য আপনাকে পরামর্শ দিচ্ছি।
zuazo

ওহ, কারণ এটি আমার ফাইলটিতে প্রচুর নতুন লাইনের এবং ক্যারিজের রিটার্ন রয়েছে। 0x0d0a
মীআও

2
প্রকৃতপক্ষে, কমান্ডটি লাইনের উইন্ডো প্রান্তের সাথে পুনরাবৃত্ত লাইনগুলি সরিয়ে দেয়। সঙ্গে পরীক্ষা echo -e 'one\r\n\r\n\r\n\rtwo'| tr -s '\r' '\n'। কমান্ড trসব অনুবাদ করবে \rকরার \nএবং তারপর সব আলিঙ্গন করবে \nমাত্র এক করতে। সুতরাং, এটি কাজ করে, ইউনিক্স নয়, উইন্ডোতে এটি প্রযোজ্য এই বিষয়টি নিয়ে কী করা যায় তা নিশ্চিত নয়।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.