मेरे पास "rtcpOnNbActive true"
एक चर में संग्रहित स्ट्रिंग है x
। मैं एक चर में सबस्ट्रिंग और स्टोर के रूप में "ट्रू" एक्सट्रैक्ट करना चाहता हूं। मैं यह कैसे कर सकता हूँ?
मेरे पास "rtcpOnNbActive true"
एक चर में संग्रहित स्ट्रिंग है x
। मैं एक चर में सबस्ट्रिंग और स्टोर के रूप में "ट्रू" एक्सट्रैक्ट करना चाहता हूं। मैं यह कैसे कर सकता हूँ?
जवाबों:
इस तरह आज़माएँ:
y=$(echo $x | awk '{print $2}')
echo $y
echo $x
का मान प्रदर्शित करें x
।awk '{print $2}'
पहले प्रदर्शित किए गए दूसरे फ़ील्ड को प्रिंट करता है x
।$(
... )
आउटपुट पकड़ो और इसे करने के लिए असाइन करें y
।echo $x
का मान प्रदर्शित नहीं होता हैx
। printf '%s\n' "$x"
होने वाला।
awk '{print $2}'
पहले प्रदर्शित की गई प्रत्येक पंक्ति के दूसरे क्षेत्र को प्रिंट करता है x
।
यह मानकर कि सबस्टेशन से पहले कम से कम एक स्थान है जिसे आप निकालना चाहते हैं (और यह कि सबस्ट्रिंग में कोई स्थान नहीं है), आप एक साधारण पैरामीटर विस्तार के साथ ऐसा कर सकते हैं:
x="rtcpOnNbActive true"
y="${x##* }"
echo "[$y]"
उत्पादन
[true]
echo
शाब्दिक स्ट्रिंग के अलावा किसी भी चीज़ के लिए पोर्टेबल नहीं है जो कि शुरू -
नहीं होती है और इसमें कोई भी क्रम नहीं होता है। इसका व्यवहार बैश बिलिन के लिए भी भिन्न होता है, यह इस बात पर निर्भर करता है कि इसे कैसे संकलित किया गया था, और क्या XPG_ECHO
सेट किया गया है। यह मानते हुए कि स्ट्रिंग में कोई क्रम नहीं है, यह ठीक होना चाहिए, लेकिन फिर printf '[%s]\n' "$y"
भी बेहतर है।
echo
में चर के मान को प्रदर्शित करने के लिए उपयोग करने की अपनी आदत को तोड़ना चाहिए , यहां तक कि "इस तरह" उदाहरणों में भी।
आप awk का उपयोग कर सकते हैं:
echo "rtcpOnNbActive true" | awk '{print $NF}'
true
NF
वर्तमान रिकॉर्ड में फ़ील्ड की संख्या
sed का उपयोग करना:
echo "rtcpOnNbActive true" | sed 's/.* //g'
true
स्ट्रिंग अभिव्यक्ति का उपयोग करना:
a="rtcpOnNbActive true"
echo ${a##* }
true
grep का उपयोग करना:
echo "rtcpOnNbActive true" | grep -Eo "[a-z]+$"
true
-o केवल सटीक मैच देता है, [a-z]+
az और $
साधनों से अंत में पत्र का मिलान करेगा
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
डिफ़ॉल्ट $ IFS व्यवहार मिलता है।
x
आपके द्वारा निकाली जाने वाली सबस्ट्रिंग से पहले हमेशा एक जगह होगी ?