"বিড়াল" এবং "ইঁদুর" শব্দযুক্ত টেক্সট ফাইল থেকে সমস্ত লাইন কীভাবে সরিয়ে ফেলবেন?
"বিড়াল" এবং "ইঁদুর" শব্দযুক্ত টেক্সট ফাইল থেকে সমস্ত লাইন কীভাবে সরিয়ে ফেলবেন?
উত্তর:
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
অপারেটর ছাড়াই ব্যবহার করুন।
( শেডের উপর ভিত্তি করে - একটি নির্দিষ্ট স্ট্রিংযুক্ত একটি লাইন মুছুন )
শুধুমাত্র টার্মিনালে পরীক্ষা করতে, ব্যবহার করুন:
sed '/[cr]at/d' file_name
ফাইল থেকে সত্যই এই লাইনগুলি সরাতে, ব্যবহার করুন:
sed -i '/[cr]at/d' file_name
যদি আপনার সাথে ফাইল আছে বিবেচনা করুন file_name
এবং আপনার মাউস অনুসন্ধান করতে চান কিন্তু মাউস থেকে কয়েক সারি মত অন্য কথায় থাকার একই সময়ে cat
এবং rat
এবং আপনি আপনার আউটপুটে সেই দেখতে না চান, তাই এক উপায় এটা করতে -
grep -r mouse file_name | grep -vE "(cat|rat)"
কাজ করে /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