जवाबों:
आप स्ट्रिंग ऑपरेटरों का उपयोग कर सकते हैं :
$ foo=1:2:3:4:5
$ echo ${foo##*:}
5
यह सब कुछ सामने से एक ':' तक, लालच से करता है।
${foo <-- from variable foo
## <-- greedy front trim
* <-- matches anything
: <-- until the last ':'
}
${foo%:*}
। #
- आरम्भ से; %
- अंत से। #
, %
- सबसे छोटा मैच; ##
, %%
- सबसे लंबा मैच।
echo ${pwd##*/}
काम नहीं करता।
pwd
एक चर के रूप में देखता है । कोशिश करो dir=$(pwd); echo ${dir##*/}
। मेरे लिये कार्य करता है!
दूसरा तरीका यह है कि पहले और बाद में उल्टा कर दिया जाए cut
:
$ echo ab:cd:ef | rev | cut -d: -f1 | rev
ef
इससे अंतिम लेकिन एक फ़ील्ड, या किसी भी श्रेणी के अंतिम छोर से प्राप्त करना बहुत आसान हो जाता है।
echo "1 2 3 4" | rev | cut -d " " -f1 | rev
rev
, बस मुझे क्या चाहिए था! cut -b20- | rev | cut -b10- | rev
कट का उपयोग करके अंतिम क्षेत्र प्राप्त करना मुश्किल है, लेकिन यहां कुछ समाधान हैं awk और perl
echo 1:2:3:4:5 | awk -F: '{print $NF}'
echo 1:2:3:4:5 | perl -F: -wane 'print $F[-1]'
/
चरित्र होता है या नहीं : /a/b/c/d
और प्रसंस्करण के /a/b/c/d/
दौरान उसी परिणाम ( d
) का उत्पादन होता है pwd | awk -F/ '{print $NF}'
। स्वीकृत उत्तर परिणाम के मामले में एक खाली परिणाम के रूप में होता है/a/b/c/d/
/
सीमांकक के रूप में उपयोग करेगा , और यदि आपका मार्ग है /my/path/dir/
तो अंतिम सीमांकक के बाद मान का उपयोग करेगा, जो बस एक खाली स्ट्रिंग है। इसलिए यदि आप को ऐसा करने की आवश्यकता है तो ट्रेसिंग स्लैश से बचना सबसे अच्छा है।
awk '{$NF=""; print $0}' FS=: OFS=:
अक्सर ऐसा कुछ काम करता है जो काफी अच्छा होता है।
काफी सरल उपयोग मानते हुए (उदाहरण के लिए सीमांकक से बचना), आप grep का उपयोग कर सकते हैं:
$ echo "1:2:3:4:5" | grep -oE "[^:]+$"
5
ब्रेकडाउन - सभी पात्रों को लाइन के अंत में सीमांकक ([^:]) नहीं मिला ($)। -साथ ही मैचिंग पार्ट को प्रिंट करता है।
एक रास्ता:
var1="1:2:3:4:5"
var2=${var1##*:}
एक और, एक सरणी का उपयोग कर:
var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
var2=${var2[@]: -1}
फिर भी एक और सरणी के साथ:
var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
count=${#var2[@]}
var2=${var2[$count-1]}
बैश का उपयोग करना (संस्करण> = 3.2) नियमित अभिव्यक्ति:
var1="1:2:3:4:5"
[[ $var1 =~ :([^:]*)$ ]]
var2=${BASH_REMATCH[1]}
$ echo "a b c d e" | tr ' ' '\n' | tail -1
e
बस एक नई सीमा में सीमांकक का अनुवाद करें और अंतिम प्रविष्टि चुनें tail -1
।
\n
, लेकिन अधिकांश मामलों के लिए सबसे पठनीय समाधान है।
का उपयोग कर sed
:
$ echo '1:2:3:4:5' | sed 's/.*://' # => 5
$ echo '' | sed 's/.*://' # => (empty)
$ echo ':' | sed 's/.*://' # => (empty)
$ echo ':b' | sed 's/.*://' # => b
$ echo '::c' | sed 's/.*://' # => c
$ echo 'a' | sed 's/.*://' # => a
$ echo 'a:' | sed 's/.*://' # => (empty)
$ echo 'a:b' | sed 's/.*://' # => b
$ echo 'a::c' | sed 's/.*://' # => c
यदि आपका अंतिम क्षेत्र एकल वर्ण है, तो आप ऐसा कर सकते हैं:
a="1:2:3:4:5"
echo ${a: -1}
echo ${a:(-1)}
बैश में स्ट्रिंग हेरफेर की जाँच करें ।
a
आखिरी, नहीं क्षेत्र ।
यहाँ कई अच्छे उत्तर हैं, लेकिन फिर भी मैं इसे बेसनेम का उपयोग करके साझा करना चाहता हूं :
basename $(echo "a:b:c:d:e" | tr ':' '/')
हालांकि यह विफल हो जाएगा अगर आपके तार में पहले से ही कुछ '/' हैं । यदि स्लैश / आपका सीमांकक है तो आपको बस (और) को बेसन का उपयोग करना चाहिए।
यह सबसे अच्छा जवाब नहीं है, लेकिन यह सिर्फ यह दर्शाता है कि आप बैश कमांड का उपयोग करके कैसे रचनात्मक हो सकते हैं।
बैश का उपयोग करना।
$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo \$${#}
0
echo ${!#}
जगह इस्तेमाल कर सकते थे eval echo \$${#}
।
for x in `echo $str | tr ";" "\n"`; do echo $x; done
उन लोगों के लिए जो पाइथन के साथ सहज हैं, https://github.com/Russell91/pythonpy इस समस्या को हल करने के लिए एक अच्छा विकल्प है।
$ echo "a:b:c:d:e" | py -x 'x.split(":")[-1]'
अजगर की मदद से -x treat each row of stdin as x
:।
उस टूल के साथ, अजगर कोड लिखना आसान है जो इनपुट पर लागू होता है।
उत्तर के साथ थोड़ा देर हो सकती है हालांकि इनपुट स्ट्रिंग के आदेश को उलटने के लिए एक सरल समाधान है। यह आपको हमेशा अंतिम आइटम हासिल करने की अनुमति देगा चाहे कोई भी लंबाई क्यों न हो।
[chris@desktop bin]$ echo 1:2:3:4:5 | rev | cut -d: -f1
5
हालांकि यह नोट करना महत्वपूर्ण है, अगर इस पद्धति और संख्याओं का उपयोग 1 अंक (या किसी भी परिस्थिति में एक वर्ण से बड़ा) से बड़ा है, तो आपको पाइप्ड आउटपुट पर एक और 'रेव' कमांड चलाने की आवश्यकता होगी।
[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1
42
[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1 | rev
24
आशा है कि मैं मदद कर सकता हूँ, चीयर्स
यदि आपको अजगर पसंद है और आपके पास पैकेज स्थापित करने का विकल्प है, तो आप इस अजगर उपयोगिता का उपयोग कर सकते हैं ।
# install pythonp
pythonp -m pip install pythonp
echo "1:2:3:4:5" | pythonp "l.split(':')[-1]"
5
echo "1:2:3:4:5" | python -c "import sys; print(list(sys.stdin)[0].split(':')[-1])"
pythonp
पैकेज का पूरा उद्देश्य आपको python -c
कम चरित्र टाइपिंग के साथ ही काम करना है । कृपया भंडार में README पर एक नज़र डालें।
5
अगर स्ट्रिंग है1:2:3:4:5:
(स्ट्रिंग ऑपरेटरों का उपयोग करते समय एक खाली परिणाम देता है)। यह विशेष रूप से तब आसान होता है जब एक परिष्करण/
चरित्र में पथ शामिल हो सकते हैं (या नहीं) ।