शेल स्क्रिप्ट में स्ट्रिंग की दी गई स्थिति में चार कैसे प्राप्त करें?
शेल स्क्रिप्ट में स्ट्रिंग की दी गई स्थिति में चार कैसे प्राप्त करें?
जवाबों:
"पैरामीटर विस्तार" $ {पैरामीटर: ऑफसेट: लंबाई} के साथ बैश में
$ 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
substr
FreeBSD, NetBSD या OS X से expr में शामिल नहीं है। यह एक पोर्टेबल समाधान नहीं है।
substr
मूल रूप से एक GNU एक्सटेंशन नहीं है। expr
70 के दशक के उत्तरार्ध में 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 -c2
POSIX नहीं है क्योंकि 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 -c2
POSIX द्वारा निर्दिष्ट व्यवहार प्राप्त करने की आवश्यकता होगी (जो कि आउटपुट के लिए आवश्यक है 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
कि आपके द्वारा पोस्ट किए गए कोड में कैसे चला जाएगा।