शेल स्क्रिप्ट में स्ट्रिंग की दी गई स्थिति में चार कैसे प्राप्त करें?


जवाबों:


37

"पैरामीटर विस्तार" $ {पैरामीटर: ऑफसेट: लंबाई} के साथ बैश में

$ 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

1
gnu.org/software/bash/manual/… में अधिक विवरण हैं
jsbillings

स्पष्ट रूप से POSIX नहीं: pubs.opengroup.org/onlinepubs/009695399/utilities/…
Ciro Santilli 新疆::: 事件

आप ऑफसेट को 'अंत से' की तरह भी सेट कर सकते हैंecho ${var: -2:1}
वासिलिस

यह वाक्य रचना ksh93 से आती है और इसके द्वारा समर्थित है zshऔर mksh
स्टीफन चेज़लस

6

पैरामीटर विस्तार का विकल्प है expr substr

substr STRING POS LENGTH
    substring of STRING, POS counted from 1

उदाहरण के लिए:

$ expr substr hello 2 1
e

शांत, अधिक अच्छी तरह से expr की जाँच करनी चाहिए।
बलफेक

1
हालांकि यह GNU कोरट्यूटिल्स से expr के साथ काम करता है, substrFreeBSD, NetBSD या OS X से expr में शामिल नहीं है। यह एक पोर्टेबल समाधान नहीं है।
घटिया

@ghoti, ध्यान दें कि substrमूल रूप से एक GNU एक्सटेंशन नहीं है। expr70 के दशक के उत्तरार्ध में PWB यूनिक्स से आया और substr(लेकिन नहीं :) का मूल कार्यान्वयन था ।
स्टीफन चेज़लस

@ स्टीफनचेज़लस, ऐतिहासिक परिप्रेक्ष्य को जोड़ने के लिए धन्यवाद। :) जबकि मुझे पूरा यकीन है कि पीडब्लूबी का उपयोग ओपी के लिए प्रासंगिक नहीं है, यह हमेशा दशकों के माध्यम से सुविधाओं और परिवर्तनों को ट्रैक करने के लिए मजेदार है। GNU कई लोगों की डिफ़ॉल्ट होती है, लेकिन सामान्य तौर पर, मुझे लगता है कि मैं उन विकल्पों का उपयोग करने से बचूंगा जो स्पष्ट रूप से POSIX नहीं हैं , और प्रमुख यूनियनों से गायब होने के लिए जाने जाते हैं।
गोटी

5

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"
स्टीफन Chazelas

ध्यान दें कि GNU के वर्तमान संस्करणों के साथ cut, यह मल्टी-बाइट वर्णों के लिए काम नहीं करता है (जो
mawk

@ StéphaneChazelas अंक के लिए धन्यवाद। मुझे समझ में नहीं आया कि आप पहले एक में क्या मतलब रखते हैं: क्या आपका मतलब यह printf 'abc '| cut -c2है कि गलत है क्योंकि नहीं \n(इस बारे में मुझे पता नहीं है), या यह कि कमांड विफल हो जाएगी अगर myvar में नई लाइनें हैं (यह मैं सहमत हूं)?
सिरो सेंटिल्ली 新疆 i iro i 事件

1
cutयदि इनपुट पाठ नहीं है (हालांकि cutकार्यान्वयन लाइनों या मनमाने ढंग से लंबाई को संभालने के लिए आवश्यक है) तो इसका व्यवहार अनिर्दिष्ट है । का आउटपुट टेक्स्टprintf abc नहीं है क्योंकि यह एक नई लाइन वर्ण में समाप्त नहीं होता है। कार्यान्वयन के आधार पर, यदि आप उसे पाइप करते हैं cut -c2, तो आप या तो प्राप्त करते हैं b, b<newline>या बिल्कुल भी नहीं। आपको printf 'abc\n' | cut -c2POSIX द्वारा निर्दिष्ट व्यवहार प्राप्त करने की आवश्यकता होगी (जो कि आउटपुट के लिए आवश्यक है b<newline>)
स्टीफन चेज़लस

1

साथ zshया yash, आप उपयोग करेंगे:

$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*

(में zsh, आप इसे छोटा कर सकते हैं printf '%s\n' $text[3])।


0

आप कट कमांड का उपयोग कर सकते हैं। तीसरा आसन पाने के लिए:

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कि आपके द्वारा पोस्ट किए गए कोड में कैसे चला जाएगा।
Kusalananda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.