আপনি যে ফাইলটি দেখিয়েছেন তাতে একটি লাইনে সমস্ত বিবরণ রয়েছে:
name : farah age : 23 phone number : 0123 education : degree
আমি ধরে নিয়েছি যে আপনি age :
কমান্ডের মধ্যে হার্ড-কোড ইত্যাদি করতে পারেন , তবে এটির পরে থাকা পাঠ্যটি ভিন্ন হবে এবং বিশদটি প্রদত্ত ক্রমে নাও বা সামঞ্জস্যপূর্ণ হতে পারে।
আপনি সঙ্গে সঙ্গতিপূর্ণ অংশগুলি নিষ্কাশন করতে পারেন grep
এর -o
পতাকা। এটি পুরো লাইনটির পরিবর্তে কেবল মিলে যাওয়া অংশটি মুদ্রণ করে।
আপনি যদি age :
এবং phone number :
অংশগুলি অন্তর্ভুক্ত করতে চান তবে আপনি -e
একাধিক ম্যাচ, বা বিকল্প পরিবর্তন করতে পতাকা ব্যবহার করতে পারেন ।
$ grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file
age : 23
phone number : 0123
অভিব্যক্তিটির [^ ]*
অর্থ এমন কোনও অক্ষর যা কোনও স্থান নয়, তাই এটি age :
পরবর্তী স্থান পর্যন্ত অক্ষরের সাথে মেলে ।
file
আপনার বিশদ সম্বলিত ফাইলের নামটি প্রতিস্থাপন করুন। >
অপারেটরের সাথে আউটপুটটিকে নতুন ফাইলে ডাইরেক্ট করে আপনি নতুন ফাইলটি লিখতে পারেন:
grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile
আপনি যখন এটি করেন, আপনি কোনও আউটপুট দেখতে পাবেন না। আপনার প্রথমে আউটপুটটি পরীক্ষা করা উচিত, তারপরে পুনঃনির্দেশ যুক্ত করুন।
এখানে বিকল্প সঙ্গে উদাহরণ। আমরা বর্ধিত রেগেক্স ব্যবহার করতে -E
পতাকাটি ব্যবহার করি grep
। বাক্য গঠনটি হ'ল (pattern1|pattern2)
- এটি মেলে pattern1
এবং / অথবা pattern2
। যদি উভয়কে পাওয়া যায় তবে এটি মুদ্রিত হবে (অন্যটি পাওয়া গেছে কিনা তা নির্বিশেষে)। আমি এখন +
আগের বর্ণের কমপক্ষে একটি চরিত্রের অর্থ ব্যবহার করছি , এর পরিবর্তে *
শূন্য বা পূর্বের বর্ণের আরও কিছু বোঝাতে চাইছি । এই প্রসঙ্গে, তারা উভয়ই সমানভাবে ভাল কাজ করে।
$ grep -Eo '(age : [^ ]+|phone number : [^ ]+)' file
age : 23
phone number : 0123
যদি আপনি age :
এবং phone number:
অংশগুলি বাদ দিতে চান তবে আপনি পার্ল-সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন ব্যবহার করতে -P
পতাকাটি ব্যবহার করতে পারেন grep
। এটি বিকল্পটিকে সমর্থন করে এবং প্রদত্ত প্যাটার্নের পরেও পাঠ্য মেলার একটি উপায়কে সমর্থন করে:
$ grep -Po '(age : \K[^ ]+|phone number : \K[^ ]+)' file
23
0123
আপনি যদি পাঠ্যটিকে অন্যভাবে ফর্ম্যাট করতে চান তবে আপনি ব্যবহার করতে পারেন sed
, উদাহরণস্বরূপ:
$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/\1:\2 | \3:\4/' file
age:23 | phone number:0123
এটি age
আগে আসার উপর নির্ভর করে phone number
, সুতরাং যদি এটি না হয় তবে সেই অনুযায়ী সামঞ্জস্য করুন। আপনি যদি অর্ডারের উপর নির্ভর করতে না পারেন তবে আপনি এটি অত্যন্ত বিভ্রান্ত আদেশটি ব্যবহার করতে পারেন:
$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/\2 \1\4/; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/\1: \2 | \3: \4/' file
phone number: 0123 | age: 23
এটি লাইনটিকে পুনরায় সাজিয়েছে যাতে phone number :
বিভাগটি প্রতিটি লাইনে প্রথমে আসে, তারপরে পছন্দসই বিশদটি নির্বাচন করতে দ্বিতীয় প্রতিস্থাপন করে। মুড়ু এই উত্তরটির জন্য এখানে ব্যবহৃত কৌশলটি আমার কাছে ণী ।
sed
পূর্ববর্তী ব্যাখ্যা দ্বারা কমান্ডের নোটস অন্তর্ভুক্ত নয়
-r
আরও পাঠযোগ্য কমান্ডের জন্য বর্ধিত রেজেক্স ব্যবহার করুন (জিএনইউ একই অর্থ sed
বোঝে -E
)
s/old/new/
old
সঙ্গে প্রতিস্থাপনnew
(pattern)
pattern
পরে \1
বা অন্যান্য সহ রেফারেন্সে সংরক্ষণ করে \2
(ক্যাপচার গ্রুপগুলি বাম-থেকে-ডান ক্রমের সাথে সম্পর্কিত - নোটটি sed
কেবল এর মধ্যে 7 টি পর্যন্ত থাকবে!)।
.
যে কোনও অক্ষর, সুতরাং .*
যে কোনও অক্ষরের সংখ্যা উপস্থাপন করে।
;
শেল হিসাবে কমান্ড পৃথক।