আপনি যে ফাইলটি দেখিয়েছেন তাতে একটি লাইনে সমস্ত বিবরণ রয়েছে:
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 টি পর্যন্ত থাকবে!)।
.যে কোনও অক্ষর, সুতরাং .*যে কোনও অক্ষরের সংখ্যা উপস্থাপন করে।
; শেল হিসাবে কমান্ড পৃথক।