मैं तुम सिर्फ साथ ऐसा कर सकते विश्वास है grep
, sort
और tail
साथ ही। यहाँ कुछ उदाहरण तार हैं।
$ echo <str> | grep -oP "\d+" | sort -n | tail -1
<str>
प्रश्न के तहत हमारी स्ट्रिंग कहां है।
उदाहरण
$ set -o posix; set | grep "str[0-9]"
str0=212334123434test233
str1=212334123434test233abc44
str2=233test212334123434
str3=a212334123434test233abc44
str4=a91234b212334123434abc
अब अगर मैं grep ...
बदले में अपनी आज्ञा से इन्हें चलाता हूँ ।
$ echo $str0 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str1 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str2 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str3 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str4 | grep -oP "\d+" | sort -n | tail -1
212334123434
यह दृष्टिकोण उन सभी पदार्थों को चुनकर काम करता है जो अंकों के अनुक्रम होते हैं। हम तब इस आउटपुट को संख्यात्मक रूप से सॉर्ट करते हैं sort -n
, और फिर सूची में अंतिम मान का उपयोग करते हुए हड़प लेते हैं tail -1
। यह सबसे लंबा सबस्ट्रिंग होगा।
आप देख सकते हैं कि यह किस तरह से काम करता है tail -1
और उदाहरणों में से एक को फिर से बदलना:
$ echo $str4 | grep -oP "\d+" | sort -n
91234
212334123434
तार जो शून्य से शुरू होते हैं
उपरोक्त दृष्टिकोण हर स्थिति के लिए काम करता है जिसे मैं एक को छोड़कर गर्भ धारण कर सकता हूं। @terdon ने इस परिदृश्य का उल्लेख किया है जो उपरोक्त दृष्टिकोण को विफल करता है।
तो इससे निपटने के लिए आपको रणनीति को थोड़ा बदलना होगा। उपरोक्त दृष्टिकोण के कर्नेल का अभी भी लाभ उठाया जा सकता है, हालांकि हमें वर्णों की संख्या को परिणामों में भी इंजेक्ट करने की आवश्यकता है। यह स्ट्रिंग्स और उनके मूल्यों में वर्णों की संख्या के आधार पर परिणाम को सॉर्ट करने की क्षमता देता है।
$ for i in $(echo $str0 | grep -oP "\d+");do a=$(echo "$i" | wc -c); \
echo "$a $i"; done | sort -n | tail -1 | cut -d" " -f2
परिणाम:
$ echo $str0
0000000000001a2test
$ for i in $(echo $str0 | grep -oP "\d+");do a=$(echo "$i" | wc -c); \
echo "$a $i"; done | sort -n | tail -1 | cut -d" " -f2
0000000000001
आप चर की लंबाई का उपयोग करके निर्धारित करने की बाश की क्षमता का उपयोग करके इसे थोड़ा सा गाढ़ा कर सकते हैं ${#var}
।
$ for i in $(echo $str0 | grep -oP "\d+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001
`Grep -P का उपयोग करना
मैंने grep -P ...
ऊपर का उपयोग करने का विकल्प चुना है क्योंकि मैं एक पर्ल डेवलपर होने के नाते, सभी अंकों को इस तरह कहने के वर्ग वाक्य रचना की तरह है: या \d+
इसके बजाय । लेकिन इस विशेष समस्या के लिए इसकी वास्तव में आवश्यकता नहीं है। तुम बस के रूप में आसानी से बदली है मैं इस तरह से इस्तेमाल किया है:[[:digit:]]\+
[0-9]\+
grep
$ .... grep -o "[0-9]\+" ....
उदाहरण के लिए:
$ for i in $(echo $str0 | grep -o "[0-9]\+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001