কোনও প্যাটার্নের সাথে মিলিত লাইনগুলি কীভাবে সন্ধান করবেন এবং সেগুলি মুছবেন?


14

প্রচুর লাইনযুক্ত একটি ফাইলে আমি শুরু হওয়া লাইনগুলি মুছতে চাই HERE IT IS

আমি কীভাবে কেবল কমান্ড-লাইন সরঞ্জাম ব্যবহার করে এটি করতে পারি?


2
যদিও কিছুটা অপ্রচলিত, আপনি vimযেমনটি ব্যবহার করতে পারেন vim '+g/^HERE IT IS/d' +wq test.txt
:;

@ ডুরকনব, এটি উল্লেখ করার জন্য আপনাকে ধন্যবাদ। আসলে আমি vim
micgeronimo

উত্তর:


29

চেষ্টা করুন sed:

sed -i '/^HERE IT IS/d' <file>

সতর্কতা: এর -iস্যুইচটি ব্যবহার করার সময় ব্যাকআপ নেওয়া ভাল sed:

sed -i.bak '/^HERE IT IS/d' <file>

মূল ফাইলটি হিসাবে থাকবে <file>.bakএবং পরিবর্তিত ফাইলটি থাকবে <file>


ম্যাচের স্ট্রিংয়ের পরে কীভাবে আমি নিউলাইন চরিত্রটি রাখতে পারি এবং নতুন লাইনে লিখতে পারি?
micgeronimo

2
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
হিমাইল

1
@ মাইক্রোনোনিমো: সাহায্য করে খুশি। আমার সম্পাদনা পরীক্ষা করুন।
হিমাইল

6
@ মাইক্রোননিমো আপনার মুখ্য প্রশ্নে সত্যই উত্তর চান তা জিজ্ঞাসা করার চেষ্টা করুন (মনে রাখবেন আপনি এটি সম্পাদনা করতে পারবেন), এমন মন্তব্যগুলির পরিবর্তে যা পরিষ্কার / মুছে ফেলা হতে পারে। আপনি ব্যবহার করতে পারেন sed '/^HERE IT IS/G' file
স্টিল্ড্রাইভার

1
শেড ব্যবহার তাই প্রো।
লক্ষ্যাগ

18

আপনি পেয়েছেন খুব ভাল grepএবং sedউত্তর ছাড়াও , এখানে কিছু অন্যান্য সরঞ্জাম যা একই জিনিস করতে পারে:

  • কয়েকটি পার্ল উপায়:

    perl -ne '/^HERE IT IS/ || print' file > newfile
    perl -ne 'print if !/^HERE IT IS/' file > newfile
    perl -ne 'print unless /^HERE IT IS/' file > newfile
    

    -iফাইলটি জায়গায় জায়গায় সম্পাদনা করতে আপনি যে কোনও উদাহরণে স্যুইচ যুক্ত করতে পারেন:

    perl -i.bak -ne '/^HERE IT IS/ || print' file        
    
  • (ছ) awk

    awk '!/^HERE IT IS/' file > newfile
    

    জিএনইউ awk(নতুন awkলিনাক্সের উপর পূর্বনির্ধারিত ) এর নতুন সংস্করণগুলি (৪.১.১ এবং তার পরে) ফাইলটি জায়গায় জায়গায় সম্পাদনা করতে পারে:

    gawk -i inplace  '!/^HERE IT IS/' file
    
  • শেল ( bash, zsh, ksh, সম্ভবত অন্যদের)। এটি যদিও নির্বোধ ধরনের, এটি করা যেতে পারে তবে অন্যান্য সরঞ্জামগুলি আরও ভাল।

    while IFS= read -r line; do 
      [[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
    done < file > newfile
    

1
আপনি ঠিক দেখাচ্ছে! ;-) (তবে আপনি একটি উত্সাহ পেয়েছিলেন, কারণ এটি স্মার্ট এবং আমি অনেক কিছু শিখেছি এবং bashএকজন আমাকে এলওএল বানিয়েছে)
ফ্যাবি

বাশটি ব্যবহার করা উচিত printf "%s\n" "$line": সাদা স্পেসগুলি সংরক্ষণ করার জন্য $ লাইনটি উদ্ধৃত করা এবং কিছু প্রতিধ্বনি সমস্যাগুলি এড়ানো (বিশেষ চরগুলি ব্যাখ্যা করা ইত্যাদি)। এবং --খুব যুক্ত করার প্রয়োজন এড়ায় ।
অলিভিয়ার ডুলাক

@ অলিভিয়ারডুলাক পর্যাপ্ত। আমি ফ্রিঞ্জের মামলার জন্য জিনিসগুলিকে জটিল করতে চাইনি তবে কুয়াংলম যেহেতু যুক্ত করেছে IFS=এবং -r, আমি পাশাপাশি সমস্ত পথে যেতে এবং এটি শক্তিশালী করে তুলতে পারি।
টেরডন

@ ইটারডন: এটি সর্বোত্তম ভাল for (এবং আমি ইতিমধ্যে এটি +1 করেছি, যদিও এটি প্রাথমিকভাবে খুব তথ্যপূর্ণ)
অলিভিয়ার ডুলাক

2
@ অলিভিয়ারডুলাক আমি আপনাকে নিশ্চয়তা দিতে পারি যে আমি যদি ইউনিক্স এবং লিনাক্সে পোস্ট করতাম তবে আমি প্রিন্টফ , আইএফএস =, -আর এবং উদ্ধৃতি ব্যবহার করতাম :)। আমি প্রায়শই এডি শ্রোতার কাছে জিনিসগুলি সহজ করি যারা প্রায়শই কমান্ড লাইনের সাথে কম স্বাচ্ছন্দ্য বোধ করে।
টেরডন

13

আমি grepতাদের ফিল্টার আউট ব্যবহার করতে হবে । উদাহরণ স্বরূপ :

grep -v "^HERE IT IS" infile > outfile

তারপরে আউটফাইলে পিছনে ছড়িয়ে পড়ুন।


চতুর চিন্তাভাবনা
আনোয়ার

5

sed অবশ্যই যেতে হবে।

@ হেইমাইল কমান্ডের এই সামান্য পরিবর্তনটি প্যাটার্ন রেফারেন্সে আই এর কারণে একই ক্ষেত্রে ব্যবহৃত হয়েছে কিনা তা লাইনটি মুছে ফেলবে।

sed -i '/HERE IT IS/Id' <file>

আপনি যদি কোনও ডিরেক্টরিতে এটি করতে চেয়েছিলেন এমন কয়েকটি ফাইল থাকে তবে আপনি এটির মতো সন্ধানের সাথে এটি একত্রিত করতে পারেন।

find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +

ম্যাক্সডেপথ বিকল্পটির অর্থ এটি ডিরেক্টরিতে পুনরাবৃত্তি হবে না।


4

আর একটি অজগর বিকল্প:

#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]

যেখানে f ফাইলের পথ, উদ্ধৃতিগুলির মধ্যে রয়েছে।


4

grep

grep -P '^(?!HERE IT IS)' file

(?!HERE IT IS)নেতিবাচক লুক হেড স্টেরিসন যা রেজেক্স ইঞ্জিনটিকে সমস্ত রেখার প্রারম্ভের সীমানা ( যা সাধারণত মিলিত হয়^ ) সাথে মিলিয়ে তোলে তবেই যদি স্ট্রিংটি অনুসরণ না করা হয়HERE IT IS

পাইথন

#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
    for line in f:
        if not line.startswith('HERE IT IS'):
            print(line, end="")

স্ক্রিপ্টটি কোনও ফাইলে সংরক্ষণ করুন, বলুন script.pyএবং তারপরে টার্মিনালের নীচের কমান্ডের মাধ্যমে এটি চালান।

python3 script.py infile

আপনি সেখানে রেগেক্স ব্যবহার করতে পারেন, পছন্দ করতে পারেন [print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)], তবে এটি এর চেয়ে বেশি দক্ষ নয় startswith। আমি ভাবলাম কীভাবে [print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]কোনও তালিকায় আউটপুট তৈরি হবে না।
অবিনাশ রাজ

আমি প্রথম যখন এটিতে ছুটে গেলাম, আমার কাছে এটি অদ্ভুত লাগছিল। এটি নির্ধারিত তালিকার সমস্ত আইটেমের জন্য একটি মুদ্রণ কমান্ড তৈরি করে (বা আপনি এর সাথে যে কোনও পদক্ষেপ নিতে চান)।
জ্যাকব ভিলিজ


1

আপনি প্রাক্তন মোডে ভিম ব্যবহার করতে পারেন:

ex -sc 'g/^HERE IT IS/d' -cx file
  1. g গ্লোবাল অনুসন্ধান

  2. d মুছে ফেলা

  3. x সংরক্ষণ করেন এবং বন্ধ করেন

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