शेल स्क्रिप्ट में स्ट्रिंग की दी गई स्थिति में चार कैसे प्राप्त करें?
शेल स्क्रिप्ट में स्ट्रिंग की दी गई स्थिति में चार कैसे प्राप्त करें?
जवाबों:
"पैरामीटर विस्तार" $ {पैरामीटर: ऑफसेट: लंबाई} के साथ बैश में
$ var=abcdef
$ echo ${var:0:1}
a
$ echo ${var:3:1}
d
संपादित करें: पैरामीटर विस्तार के बिना (बहुत सुंदर नहीं है, लेकिन यही मेरे लिए सबसे पहले आया है)
$ charpos() { pos=$1;shift; echo "$@"|sed 's/^.\{'$pos'\}\(.\).*$/\1/';}
$ charpos 8 what ever here
r
echo ${var: -2:1}
zshऔर mksh।
पैरामीटर विस्तार का विकल्प है expr substr
substr STRING POS LENGTH
substring of STRING, POS counted from 1
उदाहरण के लिए:
$ expr substr hello 2 1
e
substrFreeBSD, NetBSD या OS X से expr में शामिल नहीं है। यह एक पोर्टेबल समाधान नहीं है।
substrमूल रूप से एक GNU एक्सटेंशन नहीं है। expr70 के दशक के उत्तरार्ध में PWB यूनिक्स से आया और substr(लेकिन नहीं :) का मूल कार्यान्वयन था ।
cut -c
यदि चर में नई सीमाएँ नहीं हैं, तो आप यह कर सकते हैं:
myvar='abc'
printf '%s\n' "$myvar" | cut -c2
आउटपुट:
b
awk substr एक और पोसिक्स विकल्प है जो वैरिएबल की नई सीमाएँ होने पर भी काम करता है:
myvar="$(printf 'a\nb\n')" # note that the last newline is stripped by
# the command substitution
awk -- 'BEGIN {print substr (ARGV[1], 3, 1)}' "$myvar"
आउटपुट:
b
printf '%s\n'भागने के पात्रों के साथ समस्याओं से बचने के लिए है: /programming//a/40423558/895245 उदा:
myvar='\n'
printf '%s\n' "$myvar" | cut -c1
\उम्मीद के मुताबिक आउटपुट ।
इसे भी देखें: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scripting
उबंटू में परीक्षण 19.04।
printf '%s' "$myvar" | cut -c2POSIX नहीं है क्योंकि printfजब तक $myvarकोई नई पंक्ति वर्ण में समाप्त नहीं होती, तब तक पाठ का उत्पादन नहीं होता है। अन्यथा यह मानता है कि चर में न्यूलाइन वर्ण नहीं हैं क्योंकि इसके इनपुट की प्रत्येक पंक्ति में cutकटौती होती है ।
awkएक अधिक कुशल और के साथ विश्वसनीय होगाawk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
cut, यह मल्टी-बाइट वर्णों के लिए काम नहीं करता है (जो
printf 'abc '| cut -c2है कि गलत है क्योंकि नहीं \n(इस बारे में मुझे पता नहीं है), या यह कि कमांड विफल हो जाएगी अगर myvar में नई लाइनें हैं (यह मैं सहमत हूं)?
cutयदि इनपुट पाठ नहीं है (हालांकि cutकार्यान्वयन लाइनों या मनमाने ढंग से लंबाई को संभालने के लिए आवश्यक है) तो इसका व्यवहार अनिर्दिष्ट है । का आउटपुट टेक्स्टprintf abc नहीं है क्योंकि यह एक नई लाइन वर्ण में समाप्त नहीं होता है। कार्यान्वयन के आधार पर, यदि आप उसे पाइप करते हैं cut -c2, तो आप या तो प्राप्त करते हैं b, b<newline>या बिल्कुल भी नहीं। आपको printf 'abc\n' | cut -c2POSIX द्वारा निर्दिष्ट व्यवहार प्राप्त करने की आवश्यकता होगी (जो कि आउटपुट के लिए आवश्यक है b<newline>)
साथ zshया yash, आप उपयोग करेंगे:
$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*
(में zsh, आप इसे छोटा कर सकते हैं printf '%s\n' $text[3])।
आप कट कमांड का उपयोग कर सकते हैं। तीसरा आसन पाने के लिए:
echo "SAMPLETEXT" | cut -c3
इस लिंक को देखें http://www.folkstalk.com/2012/02/cut-command-in-unix-linux-examples.html
( उन्नत मामले ) हालांकि, IFS को संशोधित करना भी एक अच्छी बात है, खासकर जब आपके इनपुट में रिक्त स्थान हो सकते हैं। उस मामले में अकेले, नीचे दिए गए का उपयोग करें
saveifs=$IFS
IFS=$(echo -en "\n\b")
echo "SAMPLETEXT" | cut -c3
IFS=$saveifs
IFSकि आपके द्वारा पोस्ट किए गए कोड में कैसे चला जाएगा।