স্ট্রিং ভেরিয়েবল থেকে দ্বিতীয় শব্দটি বের করা


11

আমার একটি স্ট্রিং "rtcpOnNbActive true"ভেরিয়েবলের মধ্যে সঞ্চিত আছে x। আমি "ট্রু" কে সাবস্ট্রিং হিসাবে এক্সট্রাক্ট করতে এবং ভেরিয়েবলের মধ্যে সঞ্চয় করতে চাই। কিভাবে আমি এটি করতে পারব?


আপনি xযে স্ট্রস্ট্রিংটি বের করতে চান তার ঠিক আগে কি সর্বদা স্থান থাকবে ?
প্রধানমন্ত্রী 2Ring

উত্তর:


21

এইভাবে চেষ্টা করুন:

y=$(echo $x | awk '{print $2}')
echo $y
  • echo $xএর মান প্রদর্শন করুন x
  • awk '{print $2}'পূর্বে প্রদর্শিত দ্বিতীয় ক্ষেত্র মুদ্রণ করে x
  • $(... )আউটপুট ধরে রাখুন এবং এটি বরাদ্দ করুন y

3
echo $xএর মান প্রদর্শন করা হয় না । হবে. xprintf '%s\n' "$x"
স্টাফেন চেজেলাস

2
awk '{print $2}'পূর্বে প্রদর্শিত প্রতিটি লাইনের দ্বিতীয় ক্ষেত্র মুদ্রণ করে x
স্টাফেন চেজেলাস

9

ধরে নিই যে আপনি যে স্ট্রস্ট্রিংটি উত্তোলন করতে চান তার আগে কমপক্ষে একটি জায়গা রয়েছে (এবং সাবস্ট্রিংয়ের কোনও স্পেস থাকে না), আপনি একটি সাধারণ প্যারামিটার সম্প্রসারণের মাধ্যমে এটি করতে পারেন:

x="rtcpOnNbActive     true"
y="${x##* }"
echo "[$y]"

আউটপুট

[true]

3
echoআক্ষরিক স্ট্রিং ছাড়া আর কোনও কিছুর জন্য বহনযোগ্য নয় যা শুরু -হয় না এবং এতে কোনও পালানোর ক্রম থাকে না। এটি কীভাবে সংকলন করা হয়েছিল এবং XPG_ECHOসেট করা আছে কি না তার উপর নির্ভর করে ব্যাশ বিল্টিনের জন্যও এর আচরণ পরিবর্তিত হয় । ধরে নিলাম স্ট্রিংটিতে কোনও পালানোর অনুক্রম নেই, এটি ভাল হওয়া উচিত তবে printf '[%s]\n' "$y"এটি আরও ভাল।
nyuszika7h

1
@ নিউজজিকা ika আ: ভালো কথা, এবং স্টাফেন চাজেলা পড়ার পরে এখানে একই রকম কথা বলা হয়েছে এবং অন্যান্য সাম্প্রতিক প্রশ্নগুলিতে আমার echoভেরিয়েবলের মান প্রদর্শন করার অভ্যাসটি ভেঙে ফেলা উচিত , এমনকি "থ্রো-অ্যাও" উদাহরণগুলিতেও।
প্রধানমন্ত্রী 2 রিং

4

আপনি বিশ্রী ব্যবহার করতে পারেন:

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]+অ্যাজ এবং এর $অর্থের সাথে মিলবে


2
আপনার জন্য একই প্রশ্নের অন্য উত্তরের সামগ্রী পোস্ট করবেন না , দয়া করে।
нιηসнιη

1
অন্যরা কি জবাব দেয় ????
হ্যাকাহলিক

তিনি এটিকে এখানে পরিবর্তনশীল হিসাবে সংরক্ষণ করতে পারেন এটি কোনও বড় বিষয় নয়
হ্যাকাহলিক

echoআক্ষরিক স্ট্রিং ছাড়া আর কোনও কিছুর জন্য বহনযোগ্য নয় যা শুরু -হয় না এবং এতে কোনও পালানোর ক্রম থাকে না। এটি কীভাবে সংকলন করা হয়েছিল এবং XPG_ECHOসেট করা আছে কি না তার উপর নির্ভর করে ব্যাশ বিল্টিনের জন্যও এর আচরণ পরিবর্তিত হয় । এছাড়াও, আপনার সর্বদা ডাবল উক্তি পরিবর্তনশীল বিস্তৃতকরণ এবং কমান্ড প্রতিস্থাপন করা উচিত (নির্দিষ্ট ব্যতিক্রম সহ, যেখানে এটি প্রয়োজনীয় নয় তবে এটি কোনও ক্ষতিও করে না)। ওপি'র মতো স্ট্রিং সহ এটি ঠিক করা উচিত তবে আপনি যদি নিশ্চিত printf '%s\n' "${a##* }"করতে চান তবে আরও ভাল।
nyuszika7h

3

এর জন্য ব্যাশ অ্যারে ব্যবহার করা সম্ভব, যেমন:

arr="(first second third)"
echo ${arr[1]}

2

আপনি 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ডিফল্ট হয়ে যায় $ আইএফএসের আচরণ।
মাইকজার্ভ

@ মিমকিজার, আপনি আমার ক্রিসমাস কার্ডের তালিকাটি বন্ধ করে দিয়েছেন।
ইরুবার

বাহ হাম্বুগ ক্রিসমাস সফলদের জন্য।
মাইক্রজারভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.