बैश का उपयोग कर एक चर से विशेष वर्णों को हटा दें


122

मैं एक चर को पार्स करना चाहता हूं (मेरे मामले में यह विकास किट संस्करण है) इसे डॉट ( .) मुक्त बनाने के लिए। यदि version='2.3.3', वांछित आउटपुट है 233

मैंने नीचे के रूप में कोशिश की, लेकिन इसे .मुझे देने वाले दूसरे चरित्र के साथ प्रतिस्थापित करने की आवश्यकता है 2_3_3tr . ''काम होता तो ठीक रहता ।

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _

10
नहीं, यह की आवश्यकता नहीं है: echo "2.3.3" | tr -d .
14

1
@manatwork ग्रेट, जो काम करता है। आप इसे उत्तर के रूप में पोस्ट कर सकते हैं। धन्यवाद
prayagupd

1
अच्छे उत्तरों की बहुत। लेकिन अगर मैं दूसरे उद्देश्य का अनुमान लगा सकता हूं, तो 2.11.3 और 2.1.13 के बारे में चेतावनी दी जाए ... ;-) संख्या में पैडिंग ज़ीरो जोड़ने पर विचार करें।
रमानो

1
@ रमनो तुम कुछ मतलब है VERSION='2.30.3100'? कोई फर्क नहीं पड़ता कि बस .यहाँ जवाब के साथ हटा दिया जाता है।
प्रयागपाद

2
@PrayagUpd --- मेरा तात्पर्य यह था कि यदि आप तुलना के लिए रूपांतरण के बाद संख्या का उपयोग करेंगे (जैसा कि कहना है कि "यदि यह संस्करण नया या समान है") तो आपको 2.11.3 और 2.1.13 जैसे मामलों का ध्यान रखना चाहिए - - वे डॉट हटाने के बाद समान लगते हैं, लेकिन स्पष्ट रूप से 2.11.3 नया है। साथ ही, २.११.३ 2.1.14 से नया है, लेकिन २११३ और २११४ की तुलना करने से गलत उत्तर मिल जाएगा। मुझे इसके लिए एक बग याद है ...
रमानो

जवाबों:


135

बाहरी कार्यक्रम को निष्पादित करने की कोई आवश्यकता नहीं है। bashकी स्ट्रिंग परिवर्तन इसे संभाल कर सकते हैं (यह भी में उपलब्ध ksh(कहाँ से आता है) और zsh):

$ VERSION='2.3.3'
$ echo "${VERSION//.}"
233

(उन शेल मैनुअल में आप इसे पैरामीटर विस्तार अनुभाग में पा सकते हैं।)


19
आगे के विवरण के लिए, उपरोक्त उत्तर का सिंटैक्स है ${string//substring/replacement}, जहां स्पष्ट रूप से अंतिम फॉरवर्ड स्लैश और प्रतिस्थापन स्ट्रिंग की कमी को हटाने के रूप में व्याख्या की गई है । देखें यहाँ
sherrellbc

5
राइट, शेल पैरामीटर विस्तार खंड man bashमें यह स्पष्ट रूप से कहता है : " (…) यदि स्ट्रिंग अशक्त है, तो पैटर्न के मिलान हटा दिए जाते हैं और निम्नलिखित पैटर्न को छोड़ा जा सकता है।"${parameter/pattern/string}/
मैनटवर्क

1
मेरा मुद्दा यह था कि संस्करण संख्या इस तरह से आई थी "1.0.0"और मैं केवल संख्या चाहता था, इसलिए @manatwork ने सुझाव दिया कि मैंने इसमें बदलाव किया: "${VERSIONNUM//'"'}"हालांकि मैं यहां तक ' ' कि सम्मिलित करता हूं क्योंकि अन्यथा इसे ""बंद करने के लिए समान स्ट्रिंग की पहचान नहीं होगी ।
अलेक्सिस्कैनी

1
@ ऐलेक्सिनेस, आपका मतलब है कि शाब्दिक "मूल्य में मौजूद हैं? मुझे डर है कि इस नए प्रश्न के रूप में मायने रखता है, लेकिन डबलबोट से बचने की कोशिश करें: "${VERSIONNUM//\"}" pastebin.com/3ECDtkwH
manatwork

1
उत्तम!! पर -ashभी काम करता है!
Fr0zenFyr

87

कालानुक्रमिक क्रम से:

टीआर / SED

echo "$VERSION" | tr -d .
echo "$VERSION" | sed 's/\.//g'

csh / tcsh

echo $VERSION:as/.//

POSIX गोले:

set -f
IFS=.
set -- $VERSION
IFS=
echo "$*"

ksh / zsh / bash / yash (और बिजीबॉक्स ashजब साथ बनाया जाता है ASH_BASH_COMPAT)

echo "${VERSION//.}"

zsh

echo $VERSION:gs/./

1
tr -d ने सेट से एक भी चार हटा दिया। Ex के लिए मैं DCC_ को "DCC_VersionD" से हटाना चाहता हूं, यह DCC और D. अपेक्षित आउटपुट को हटा देता है: VersionD। वास्तविक आउटपुट: संस्करण। sed ने एक आकर्षण की तरह काम किया। :) पोस्ट के लिए धन्यवाद।
काइल

20

सफल जवाब के अलावा पहले से ही मौजूद है। विकल्प के trसाथ एक ही चीज हासिल की जा सकती है --delete

echo "2.3.3" | tr --delete .

जो आउटपुट देगा: 233


6
मैकोस पर --deleteध्वज को मान्यता नहीं दी गई है, लेकिन आप -dइसके बजाय उपयोग कर सकते हैं
एनेंट्रोपिक

6

आपको sedइसके बजाय प्रयास करना चाहिए

sed 's/\.//g'


4
echo "$VERSION" | tr -cd [:digit:]

यह केवल अंकों को लौटाएगा, चाहे अन्य वर्ण मौजूद हों


4

पर्ल

$ VERSION='2.3.3'                                     
$ perl -pe 's/\.//g' <<< "$VERSION"           
233

अजगर

$ VERSION='2.3.3'                                     
$ python -c 'import sys;print sys.argv[1].replace(".","")' "$VERSION"
233

यदि $VERSIONकेवल अंक और बिंदु हैं, तो हम कुछ कम भी कर सकते हैं:

$ python -c 'print "'$VERSION'".replace(".","")'
233

(यह एक कोड इंजेक्शन भेद्यता है, हालांकि अगर $VERSIONकिसी भी चरित्र हो सकता है) खबरदार ।

AWK

$ VERSION='2.3.3'
$ awk 'BEGIN{gsub(/\./,"",ARGV[1]);print ARGV[1]}' "$VERSION"
233

या यह:

$ awk '{gsub(/\./,"")}1' <<< "$VERSION"
233
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.