एक स्ट्रिंग चर से दूसरा शब्द निकालना


11

मेरे पास "rtcpOnNbActive true"एक चर में संग्रहित स्ट्रिंग है x। मैं एक चर में सबस्ट्रिंग और स्टोर के रूप में "ट्रू" एक्सट्रैक्ट करना चाहता हूं। मैं यह कैसे कर सकता हूँ?


क्या xआपके द्वारा निकाली जाने वाली सबस्ट्रिंग से पहले हमेशा एक जगह होगी ?
PM 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
@ nyuszika7h: अच्छी बात है, और स्टीफन चेज़ेलस ने पढ़ने के बाद यहाँ भी ऐसी ही बातें कही हैं और अन्य हालिया सवालों में मुझे वास्तव echoमें चर के मान को प्रदर्शित करने के लिए उपयोग करने की अपनी आदत को तोड़ना चाहिए , यहां तक ​​कि "इस तरह" उदाहरणों में भी।
PM 2Ring

4

आप 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 और $साधनों से अंत में पत्र का मिलान करेगा


2
कृपया एक ही प्रश्न में आपके लिए अन्य उत्तर की सामग्री पोस्ट न करें।
α atsнιη

1
दूसरे क्या जवाब देते हैं ????
हैकाहॉलिक

वह इसे चर में बचा सकता है, यहाँ कोई बड़ी बात नहीं है
Hackaholic

echoशाब्दिक स्ट्रिंग के अलावा किसी भी चीज़ के लिए पोर्टेबल नहीं है जो कि शुरू -नहीं होती है और इसमें कोई भी क्रम नहीं होता है। इसका व्यवहार बैश बिलिन के लिए भी भिन्न होता है, यह इस बात पर निर्भर करता है कि इसे कैसे संकलित किया गया था, और क्या XPG_ECHOसेट किया गया है। इसके अलावा, आपको हमेशा डबल चर चर विस्तार और कमांड प्रतिस्थापन (कुछ अपवादों के साथ, जहां यह आवश्यक नहीं है, लेकिन यह कोई नुकसान नहीं करता है) होना चाहिए। ओपी की तरह एक स्ट्रिंग के साथ, यह ठीक होना चाहिए, लेकिन अगर आप सुनिश्चित printf '%s\n' "${a##* }"करना चाहते हैं कि यह बेहतर होगा।
nyuszika7h

3

इसके लिए bash सरणियों का उपयोग करना संभव है, जैसे:

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यहां मूल्य निर्दिष्ट करने की आवश्यकता है।
mikeserv

@ बाइक, यह readबंटवारे का उपयोग कर रहा है IFS, दस्तावेज की जांच करें । रीड का उपयोग करने के साथ मुख्य लाभ यह है कि यह चर सेट करता है (जो एक ओपी आवश्यकता है) और यह देखते हुए कि यह स्ट्रिंग्स को विभाजित कर सकता है और एक सरणी को आबाद कर सकता है, एक स्ट्रिंग से मनमाना फ़ील्ड निकालने के लिए अच्छा है। इसके अतिरिक्त, मैं IFSयहां डिफ़ॉल्ट मान रहा हूं , लेकिन यदि आवश्यक IFS=$' \n\t' read -r _ y <<<"$x"हो तो इसे सेट करना काफी आसान है, चाल
चलेगा

नहीं यह नहीं। readअसाइन करता है, $IFSविभाजन करता है। यदि आप किसी सरणी को पॉप्युलेट करना चाहते हैं, तो उपयोग करें set- आपको उस मामले में कृत्रिम यहाँ-स्ट्रिंग बकवास की आवश्यकता नहीं है। unset IFSडिफ़ॉल्ट $ IFS व्यवहार मिलता है।
mikeserv

@ बाइक, आप मेरी क्रिसमस कार्ड सूची बंद कर रहे हैं।
इरुवर

बाह पाखण्ड। क्रिसमस चूसने वालों के लिए है।
15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.