উত্তর:
awk এখানে একটি ভাল সরঞ্জাম হতে পারে।
$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost
"POP3_SERVER_NAME" ধারণকারী লাইনগুলি অনুসন্ধান করুন; শেষ ক্ষেত্রটি মুদ্রণ করুন। এটি সর্বদা 3 লাইনে থাকা POP3_SERVER_NAME এর উপর নির্ভর করে না, এটি সম্ভবত একটি ভাল জিনিস।
$ awk '/POP3_SERVER_NAME/{print $NF}' test.dat
localhost
আপনার প্রয়োগের উপর নির্ভর করে আপনার নিয়মিত প্রকাশকে আরও কঠোর করার প্রয়োজন হতে পারে। উদাহরণস্বরূপ, আপনি কেবল সেই লাইনটিই পপ করতে চাইতে পারেন যা POP3_SERVER_NAME এর সাথে শুরু হয়।
$ awk '/^POP3_SERVER_NAME/{print $NF}' test.dat
localhost
সেড ব্যবহার করা কিছুটা স্বজ্ঞাত। (ধন্যবাদ, আমি বিড়ম্বনা সম্পর্কে অবহিত)) যে লাইনে POP3_SERVER_NAME রয়েছে সেটিকে যে কোনও জায়গায় সম্বোধন করুন। "=" অনুসরণ করে লাইনের শুরু থেকে alচ্ছিক স্থান পর্যন্ত সমস্ত পাঠ্যের জন্য একটি খালি স্ট্রিং প্রতিস্থাপন করুন। তারপরে প্রিন্ট করুন।
sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat
awk
স্পেস থেকে অন্য যে কোনও কিছু ব্যবহার করে ডিলিমিটার ব্যবহার করতে পারেন -F
। উদাহরণস্বরূপ: আপনি যে ক্ষেত্রে উল্লেখ করেছেন সীমাবদ্ধ হিসাবে -F "="
ব্যবহার করবে =
।
p
কমান্ডটি প্রতিস্থাপনের মাধ্যমে প্রতিস্থাপন করুন যা লাইনের অযাচিত অংশ সরিয়ে দেয়।
sed -n '3 s/^[^=]*= *//p' installation.sh
আপনি পজিশনের পরিবর্তে কীওয়ার্ডের সাহায্যে লাইনটি মেলাতে চাইতে পারেন।
sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh
দেখে মনে হচ্ছে আপনার কাছে একটি কনফিগার ফাইল আছে। আপনি যা করতে পারেন তা অ্যাডাম সিমিওন / এসএমএল-এর অনুরূপ:
sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename
যেখানে [^=]
বাদ সব '=' অক্ষর, +
এক বা চরিত্রের একই ধরণের আরো, এই একটি প্রকৃত দ্বারা অনুসরণ বলেছেন =
, \s
কোনো হোয়াইটস্পেস (ট্যাব সহ \t
এবং নতুন লাইন \n
, \r\n
এবং সমভূমির স্পেস '', যেহেতু *
মানে শূন্য বা একই ধরণের আরো , বন্ধনীগুলি ম্যাচের চরিত্রের অনুক্রমগুলি \ 1, \ 2, ...,, n প্রতিস্থাপন স্থানধারীদের মধ্যে রাখার জন্য যা অভ্যন্তরীণ তা ধরা দেয়, $
এটি একটি লাইনটির শেষে বোঝায় This এটির আদর্শ প্রতিস্থাপনের ধরণটি অনুসরণ করে: s/.../.../modifiers
কমান্ড লাইন বিকল্পটি -r
দাঁড়ায় এক্সটেন্ডেড রেজেক্স সিনট্যাক্স (সুবিধার্থে হিসাবে) এবং এর -n
অর্থ আউটপুট কিছুই না হওয়া পর্যন্ত বা স্পষ্টভাবে অনুরোধ করা না হওয়া পর্যন্ত পরিবর্তনটি ফলাফলটি p
মুদ্রণ করে।
আপনি g
মডিফায়ারের সাহায্যে বিশ্বব্যাপী অনুসন্ধান করতে পারেন:
sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename # note the space after \1
তাই আপনি একটি স্ট্রিং দ্বারা পৃথক পেতে যে ' '
(হতে পারে \n
, \t
, বা কি আপনার আছে) যা আপনি সহজেই প্রক্রিয়া করতে পারি।
উভয়ই বৈধ হয় যদি আপনার মানগুলি একটি রেখার শেষ অবধি সমীকরণ চরিত্রের পূর্বে বিস্তৃত থাকে এবং মন্তব্য বা অন্যান্য অক্ষর দ্বারা অনুসরণ করা হয় না তবে একটি সাধারণ "মান" থেকে বিচ্যুত শব্দার্থবিজ্ঞান রয়েছে।
আমি অন্যান্য পোস্টে এখনও এখানে মন্তব্য করতে পারবেন না। রেখাটি চিহ্নিত করতে কেবল আপনার ক্ষেত্রে 3, s
প্রারম্ভিক উদ্ধৃতি চরের আগে (আগে ভিএম এর মতো) আগে লাইন নম্বরটি পাস করুন ।
sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename
দয়া করে কটাক্ষপাত করা info sed
। উদাহরণস্বরূপ, 3.2 এবং 4.7 আপনার বিশেষ আগ্রহী।
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost
বা যদি আপনার কোনও ফাইলে বিষয়বস্তু থাকে:
sed 's/.*= //' somefile.txt
localhost
লিনাক্স / ইউনিক্সের সৌন্দর্য হ'ল কিছু সাধারনত একাধিক উপায় থাকে। অপটির ক্ষেত্রে, ফাইল থেকে পিওপি সার্ভারের নাম আহরণের কমপক্ষে চারটি ভিন্ন উপায় রয়েছে:
grep POP3_SERVER_NAME installation.sh | cut -d'=' -f2
grep POP3_SERVER_NAME installation.sh | awk '{print $3}'
grep POP3_SERVER_NAME installation.sh | sed 's/.*= //'
sed -n 's/^.*POP3_SERVER_NAME = //p' installation.sh
awk
কমান্ড সুন্দর - কিন্তু আপনার চারপাশের স্পেস পেয়েছেন শুধুমাত্র যদি=
। এটি কাজ করবে নাPOP3_SERVER_NAME=localhost
।