প্রদত্ত নিদর্শনগুলির সেট থেকে কোনও প্যাটার্ন দিয়ে শুরু না হওয়া লাইনগুলি সরান


11

আমার কাছে একটি ফাইল রয়েছে যা এতে ডেটা যুক্ত করে:

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc

.. --.

প্রশ্ন: আমি যে কোনও লাইন নীচের স্ট্রিং দিয়ে শুরু না করে সরিয়ে দিতে চাই:

report  
-th  
-to

তার মানে ইচ্ছা আউটপুট সেই সমস্ত মাঝারি অযাচিত বিন্দু এবং হ্যাশগুলি সরিয়ে ফেলবে এবং এর মতো দেখতে পাবেন:

report aaaaaaaa  
-th bbbbbbbbb  
-to ccccccccc

sed/ awk/ grep/ ইত্যাদি যে কোনও সমাধান কার্যকর হবে।

উত্তর:


15

sedজায়গায় জায়গায় ফাইলটি পরিবর্তন করতে ব্যবহার করে:

sed -i '/^\(report\|-t\(h\|o\)\)/!d' your_file

এটি sedপ্যাটার্নের সাথে মেলে না এমন সমস্ত লাইন মুছতে নির্দেশ দেয়। প্যাটার্ন নিজেই ^(লাইনের শুরু), নয়তো দ্বারা অনুসরণ reportবা -tদ্বারা পারেন অনুসৃত hবা o

আপনার লক্ষ করা উচিত যে এটি প্রকৃত স্থানে পরিবর্তন নয়: sedএকটি অস্থায়ী ব্যাকআপ কপি তৈরি করে এবং এটির সাথে মূল ফাইলটি ওভাররাইট করে।

আপনি যদি sedমূল ফাইলটির ব্যাকআপ কপি রাখতে চান (তবে ফাইলটিতে সমালোচনামূলক ডেটা থাকে তবে এটি ভাল ধারণা হতে পারে), -iব্যাকআপ ফাইল তৈরি করতে স্যুইচটিকে একটি এক্সটেনশান দিন:

sed -i'.bak' -e '/^\(report\|-t\(h\|o\)\)/!d' your_file

পরিবর্তিত your_fileএবং মূল কল একটি ব্যাকআপ তৈরি করবে your_file.bak

একটি পাশ নোট

দয়া করে আমার উদ্দেশ্যগুলিকে ভুল ধারণা না জাগিয়ে তুলুন বা এটাকে অপরাধ হিসাবে গ্রহণ করবেন না, তবে আমি লক্ষ্য করেছি যে আপনার অনেক অনুরূপ রেজেক্স / পাঠ্য-প্রক্রিয়াকরণ সম্পর্কিত প্রশ্ন রয়েছে। আমি আপনাকে শিখতে শুরু করার পরামর্শ দিচ্ছি sed, awkএবং grepআপনার নিজের উত্পাদনশীলতা গতিতে সহায়তা করার জন্য। আবার, আমাকে ভুল করবেন না, সাহায্য করার জন্য আমি সকলেই খুব খুশি (যেমন আশেপাশের বেশিরভাগ লোকেরা); এটি কেবলমাত্র আমি মনে করি যে আপনার প্রতিদিনের ব্যবহারের জন্য এই সরঞ্জামগুলি বাছাই করে আপনি প্রচুর উপকারের পক্ষে দাঁড়িয়েছেন।

লোকেরা এখানে কতটা সহায়ক তা প্রমাণ করার জন্য, নীচের মন্তব্যে @ এসএমএলের পরামর্শ বিবেচনা করুন এবং প্রশ্নের জন্য যে কোনও সময় এই চ্যাটরুমটি থেকে নিঃসঙ্কোচে পড়তে পারেন ।


1
আপনার নিয়মিত প্রকাশটি অহেতুক রহস্যজনক বলে মনে হচ্ছে। আমি মনে করি আপনি যদি কেবল তিনটি বিকল্পকে স্পষ্টভাবে তালিকাভুক্ত করে থাকেন তবে এর চেয়ে আপনি আসলে আরও বেশি অক্ষর ব্যবহার করেন।
নিস্পিও

1
@ স্প্যানিও আমি জানি, তবে প্রশ্নে থাকা ফাইলটি বড় হলে এটি আরও কার্যকর হওয়ার সম্ভাবনা রয়েছে।
জোসেফ আর।

মজাদার. আমি সর্বদা দৈর্ঘ্য বা পঠনযোগ্যতার নিরিখে রেজেক্সপগুলি পরিমাপ করেছি। মৃত্যুদন্ড কার্যকর করার গতি সম্পর্কে আমি কখনই তেমন চিন্তাভাবনা করিনি। আমি মনে করি না যে কীভাবে দ্রুত তা বিচার করার জন্য তাদের কীভাবে মূল্যায়ন করা হয় আমি যথেষ্ট জানি, তবে আমি ধরে নিই যে এটি বাস্তবায়নও নির্দিষ্ট, ঠিক?
নিস্পিও

3
জোসেফ সাহায্য করতে ইচ্ছুক হওয়ার বিষয়ে যা বলেছে তার পুনরাবৃত্তি, আপনার যদি প্রশ্ন ও উত্তর শৈলীতে ফিট করে না এমন সাধারণ প্রশ্ন থাকে তবে আপনি এই সাইটের জন্য চ্যাট ঘরে সর্বদা আমাদের চ্যাট করতে চেষ্টা করতে পারেন। chat.stackexchange.com/rooms/26/unix-and-linux । আমাদের বেশিরভাগ সেখানে 8-) বাস করেন
slm

@ এসএলএম এই জন্য আপনাকে ধন্যবাদ। আমি আমার উত্তরে এটি যুক্ত করব।
জোসেফ আর।


2

ব্যবহার sed:

sed -n -e '/^report\|^-th\|^-to/p' filename

এটা একটা সেভিংস অনেক না, কিন্তু আপনি একত্রিত পারে -th/ -toমধ্যে -t[ho]
কেভিন

1
@ কেভিন এটি সত্য। জোসেফ আর এর সাথে আমার কথোপকথনটি তার উত্তরের মন্তব্যে দেখুন।
নিস্পিও

2

ব্যবহার awk:

awk '/^report|^-t[ho]/' file

এটা একটা সেভিংস অনেক না, কিন্তু আপনি একত্রিত পারে -th/ -toমধ্যে -t[ho]
কেভিন

1

প্রশ্নকর্তা দুটি বিষয় করেছেন:

  • "প্রতিবেদন" বা "-ম" বা "-টু" দিয়ে শুরু না করে যে কোনও লাইন সরিয়ে ফেলতে চাইছেন।
  • পছন্দসই আউটপুটটি "সেই সমস্ত মধ্যম অযাচিত বিন্দু এবং হ্যাশগুলি (sic)" মুছে ফেলা উচিত

সমাধানগুলি, এই সময়ে, প্রথম পয়েন্টটি সম্বোধন করে এবং এর মাধ্যমে দ্বিতীয়টিও। তবে ধরুন ফাইলটি বড় এবং দেখতে দেখতে:

report aaaaaaaa  
-  ..  
-th bbbbbbbbb  
-to ccccccccc
anything else
.. --.
-tp ddd
-tq eee
     -  -----

ওপির দ্বিতীয় পয়েন্টটি সম্বোধন করা কি প্রয়োজনীয় হবে না?

sed -r -i.bak '/^[ |.|-]*$/d' input-file 

কেবল ফাঁকা জায়গা, বিন্দু এবং ড্যাশগুলি ধারণ করে সম্ভবত অবাঞ্ছিত রেখাগুলি সরিয়ে এবং বাকি যা কিছু আছে তা ধরে রাখার কাজটি করে।
আমি মনে করি যে উভয় পদ্ধতির পদ্ধতির ঝুঁকি হ'ল ফাইলের প্রকৃতি সঠিকভাবে সংজ্ঞায়িত হয়নি।


0

পার্ল ব্যবহার:

perl -ne 'print if /^report|^-t[ho]/' filename > newfile

বা, জায়গায় সম্পাদনা করতে (যেমন sed, perlএকটি অস্থায়ী ব্যাকআপও তৈরি করবে যাতে এটি স্থান সম্পাদনে সত্য নয় ):

perl -i.bak -ne 'print if /^report|^-t[ho]/' filename

এটি মূল ফাইলটির একটি অনুলিপি তৈরি করবে filename.bakএবং সম্পাদিত সংস্করণ দিয়ে আপনার আসল ফাইলটি ওভাররাইট করবে।

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