আমার একটি স্ট্রিং "rtcpOnNbActive true"ভেরিয়েবলের মধ্যে সঞ্চিত আছে x। আমি "ট্রু" কে সাবস্ট্রিং হিসাবে এক্সট্রাক্ট করতে এবং ভেরিয়েবলের মধ্যে সঞ্চয় করতে চাই। কিভাবে আমি এটি করতে পারব?
আমার একটি স্ট্রিং "rtcpOnNbActive true"ভেরিয়েবলের মধ্যে সঞ্চিত আছে x। আমি "ট্রু" কে সাবস্ট্রিং হিসাবে এক্সট্রাক্ট করতে এবং ভেরিয়েবলের মধ্যে সঞ্চয় করতে চাই। কিভাবে আমি এটি করতে পারব?
উত্তর:
এইভাবে চেষ্টা করুন:
y=$(echo $x | awk '{print $2}')
echo $y
echo $xএর মান প্রদর্শন করুন x।awk '{print $2}'পূর্বে প্রদর্শিত দ্বিতীয় ক্ষেত্র মুদ্রণ করে x।$(... )আউটপুট ধরে রাখুন এবং এটি বরাদ্দ করুন y।echo $xএর মান প্রদর্শন করা হয় না । হবে. xprintf '%s\n' "$x"
awk '{print $2}'পূর্বে প্রদর্শিত প্রতিটি লাইনের দ্বিতীয় ক্ষেত্র মুদ্রণ করে x।
ধরে নিই যে আপনি যে স্ট্রস্ট্রিংটি উত্তোলন করতে চান তার আগে কমপক্ষে একটি জায়গা রয়েছে (এবং সাবস্ট্রিংয়ের কোনও স্পেস থাকে না), আপনি একটি সাধারণ প্যারামিটার সম্প্রসারণের মাধ্যমে এটি করতে পারেন:
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
আউটপুট
[true]
echoআক্ষরিক স্ট্রিং ছাড়া আর কোনও কিছুর জন্য বহনযোগ্য নয় যা শুরু -হয় না এবং এতে কোনও পালানোর ক্রম থাকে না। এটি কীভাবে সংকলন করা হয়েছিল এবং XPG_ECHOসেট করা আছে কি না তার উপর নির্ভর করে ব্যাশ বিল্টিনের জন্যও এর আচরণ পরিবর্তিত হয় । ধরে নিলাম স্ট্রিংটিতে কোনও পালানোর অনুক্রম নেই, এটি ভাল হওয়া উচিত তবে printf '[%s]\n' "$y"এটি আরও ভাল।
echoভেরিয়েবলের মান প্রদর্শন করার অভ্যাসটি ভেঙে ফেলা উচিত , এমনকি "থ্রো-অ্যাও" উদাহরণগুলিতেও।
আপনি বিশ্রী ব্যবহার করতে পারেন:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF বর্তমান রেকর্ডে ক্ষেত্রের সংখ্যা
সেড ব্যবহার:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
স্ট্রিং এক্সপ্রেশন ব্যবহার করে:
a="rtcpOnNbActive true"
echo ${a##* }
true
গ্রেপ ব্যবহার:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-ও কেবল সঠিক মিল দেয়, শেষের দিকে [a-z]+অ্যাজ এবং এর $অর্থের সাথে মিলবে
echoআক্ষরিক স্ট্রিং ছাড়া আর কোনও কিছুর জন্য বহনযোগ্য নয় যা শুরু -হয় না এবং এতে কোনও পালানোর ক্রম থাকে না। এটি কীভাবে সংকলন করা হয়েছিল এবং XPG_ECHOসেট করা আছে কি না তার উপর নির্ভর করে ব্যাশ বিল্টিনের জন্যও এর আচরণ পরিবর্তিত হয় । এছাড়াও, আপনার সর্বদা ডাবল উক্তি পরিবর্তনশীল বিস্তৃতকরণ এবং কমান্ড প্রতিস্থাপন করা উচিত (নির্দিষ্ট ব্যতিক্রম সহ, যেখানে এটি প্রয়োজনীয় নয় তবে এটি কোনও ক্ষতিও করে না)। ওপি'র মতো স্ট্রিং সহ এটি ঠিক করা উচিত তবে আপনি যদি নিশ্চিত printf '%s\n' "${a##* }"করতে চান তবে আরও ভাল।
আপনি readঅন্তর্নির্মিত ব্যবহার করতে পারে
read -r _ y <<<"$x"
printf "%s\n" "$y"
true
read? এটি readবিভাজন করে না - এটি হয় $IFS। কিছু কারণে মানুষ অনেক এটা ঠিক আছে W বিভক্ত বিবেচনা / $IFS শুধুমাত্র যখন readজড়িত আছেন। আপনি কেবল করতে পারেন: set -f; IFS=' '; printf %.0s%s $xবা যাই হোক না কেন। যে কোনও ক্ষেত্রে - আপনার $IFSএখানে মান উল্লেখ করতে হবে ।
readবিভাজনটি ব্যবহার IFSকরে ডকুমেন্টেশন চেক করুন । পঠন ব্যবহারের প্রধান সুবিধাটি হ'ল এটি ভেরিয়েবল সেট করে (যা একটি ওপি প্রয়োজনীয়তা) এবং প্রদত্ত যে এটি স্ট্রিংগুলি বিভক্ত করতে পারে এবং একটি অ্যারে পপুলেট করতে পারে, একটি স্ট্রিং থেকে স্বেচ্ছাসেবী ক্ষেত্রগুলি উত্তোলনের জন্য ভাল। অতিরিক্ত হিসাবে, আমি IFSএখানে ডিফল্ট ধরে নিচ্ছি , তবে প্রয়োজনে এটি নির্ধারণ করা যথেষ্ট সহজ, IFS=$' \n\t' read -r _ y <<<"$x"কৌশলটি
readবরাদ্দ, $IFSবিভক্ত। আপনি যদি কোনও অ্যারে তৈরি করতে চান তবে ব্যবহার করুন set- আপনার ক্ষেত্রে কৃত্রিম এখানে স্ট্রিংয়ের বাজে কথা দরকার না। unset IFSডিফল্ট হয়ে যায় $ আইএফএসের আচরণ।
xযে স্ট্রস্ট্রিংটি বের করতে চান তার ঠিক আগে কি সর্বদা স্থান থাকবে ?