টার্মিনালের মাধ্যমে নির্দিষ্ট শব্দ যুক্ত টেক্সট ফাইল থেকে লাইনগুলি কীভাবে সরিয়ে ফেলবেন?


72

"বিড়াল" এবং "ইঁদুর" শব্দযুক্ত টেক্সট ফাইল থেকে সমস্ত লাইন কীভাবে সরিয়ে ফেলবেন?


এটি হোমওয়ার্ক অ্যাসাইনমেন্টের মতো সন্দেহজনকভাবে শোনাচ্ছে। আপনার উত্তরটি আসুবুন্টুতে সুন্দর লোকদের কাছে দেওয়ার জন্য দয়া করে মনে রাখবেন।
zwets

এটি বড় প্রকল্পের একটি অংশ, আমি লিনাক্স পরিবেশে নতুন।
পার্সোনএক্স

উত্তর:


100

grep অভিগমন

"বিড়াল" বা "ইঁদুর" না মিলিয়ে লাইনগুলি না দিয়ে ফাইলটির অনুলিপি তৈরি করতে, কেউ grepবিপরীত ( -v) এবং পুরো শব্দ বিকল্প ( -w) সহ ব্যবহার করতে পারে ।

grep -vwE "(cat|rat)" sourcefile > destinationfile

পুরো শব্দ বিকল্পটি নিশ্চিত করে যে এটি মেলে না catsবা gratefulউদাহরণস্বরূপ for আপনার শেলের আউটপুট পুনর্নির্দেশটি >নতুন ফাইলটিতে লিখতে ব্যবহৃত হয় ( )। সিনট্যাক্সের -Eজন্য বর্ধিত নিয়মিত প্রকাশগুলি সক্ষম করার জন্য আমাদের বিকল্পের প্রয়োজন (one|other)

sed অভিগমন

বিকল্পভাবে, স্থানটিতে থাকা লাইনগুলি সরাতে এটি ব্যবহার করতে পারে sed -i:

sed -i "/\b\(cat\|rat\)\b/d" filename

\bসেট শব্দ টি চার আর dঅপারেশন ফরওয়ার্ড স্ল্যাশ মধ্যে অভিব্যক্তি মিলে লাইন মুছে ফেলা হবে। catএবং ratউভয়ই (one|other)সিনট্যাক্সের সাথে মিলে যাচ্ছে যা আমাদের স্পষ্টতই ব্যাকস্ল্যাশ সহ পালাতে হবে।

টিপ: ফাইলটি ওভাররাইট করার আগে কমান্ডের আউটপুট পরীক্ষা sedকরতে -iঅপারেটর ছাড়াই ব্যবহার করুন।

( শেডের উপর ভিত্তি করে - একটি নির্দিষ্ট স্ট্রিংযুক্ত একটি লাইন মুছুন )


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

1
@ শ্রীধর-সারনোবাত ওহ, আপনি পারেন। স্টডআউট অনুলিপি করতে টি এবং সাবসেল ব্যবহার করুন। একটিতে আপনি ফিল্টার করেন, অন্যটিতে বিপরীতে। টি এবং সাবসেলের ব্যবহার এখানে কোনও সম্পর্কহীন ইউজকেসে প্রদর্শিত হয়েছে: blog.g3rt.nl/…
জার্মটভিডিজক

15

শুধুমাত্র টার্মিনালে পরীক্ষা করতে, ব্যবহার করুন:

sed '/[cr]at/d' file_name

ফাইল থেকে সত্যই এই লাইনগুলি সরাতে, ব্যবহার করুন:

sed -i '/[cr]at/d' file_name

5

ভিম-ওয়ে চেষ্টা করে দেখুন:

ex +"g/[cr]at/d" -scwq file.txt

0

যদি আপনার সাথে ফাইল আছে বিবেচনা করুন file_nameএবং আপনার মাউস অনুসন্ধান করতে চান কিন্তু মাউস থেকে কয়েক সারি মত অন্য কথায় থাকার একই সময়ে catএবং ratএবং আপনি আপনার আউটপুটে সেই দেখতে না চান, তাই এক উপায় এটা করতে -

grep -r mouse file_name | grep -vE "(cat|rat)"

0

বহনযোগ্য শেল উপায়

কাজ করে /bin/shযা dashউবুন্টুতে রয়েছে, পাশাপাশি ksh, এবং bash। খানিকটা বিশ্রী যে আপনাকে caseবিবৃতিতে প্রতিটি শব্দের জন্য একাধিক পরীক্ষার মামলা লিখতে হবে তবে বহনযোগ্য cases এই ক্ষেত্রে কাজ করে যেখানে শব্দটি রেখার একা লাইনের শুরুতে, শেষের দিকে বা লাইনের মাঝখানে উপস্থিত হয় এবং যেখানে এটি অন্য শব্দের অংশ হতে পারে তা উপেক্ষা করে।

#!/bin/sh
line_handler(){
   # $1 is line read, prints to stdout
    case "$1" in
        cat|cat\ *|*\ cat\ *|*\ cat) true;; # do nothing if cat or rat in line
        rat|rat\ *|*\ rat\ *|*\ rat) true;; 
        *) printf "%s\n" "$1"
    esac
}

readlines(){
    # $1 is input file, the rest is words we want to remove
    inputfile="$1"
    shift

    while IFS= read -r line;
    do
        line_handler "$line" "$@"
    done < "$inputfile"
    [ -n "$line" ] && line_handler "$line" 
}

readlines "$@"

এবং এটি এইভাবে কাজ করে:

$ cat input.txt                                                                                                                                                        
the big big fat cat
the cat who likes milk 
jumped over gray rat
concat 
this is catchy
rat
rational
irrational
$ ./dellines.sh input.txt                                                                                                                                              
concat 
this is catchy
rational
irrational
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.