बैश में अग्रणी स्ट्रिंग निकालें


10

मेरे पास एक स्ट्रिंग है जैसे rev00000010और मैं केवल इस मामले में अंतिम संख्या, 10 चाहता हूं।

मैंने यह कोशिश की है:

TEST='rev00000010'
echo "$TEST" | sed '/^[[:alpha:]][0]*/d'
echo "$TEST" | sed '/^rev[0]*/d'

दोनों कुछ भी नहीं लौटाते हैं, हालांकि रेगेक्स सही लगता है ( रेगेक्स के साथ प्रयास किया गया है )


जवाबों:


16

आपके द्वारा आदेशित आदेश का sedअर्थ है: यदि कोई रेखा regex से मेल खाती है, तो उसे हटा दें । वही नहीं जो आप चाहते हैं।

echo "$TEST" | sed 's/rev0*//'

इसका मतलब है: प्रत्येक पंक्ति पर, किसी भी संख्या में शून्य के बाद रिवाइव निकालें।

इसके अलावा, आप sedइस तरह के एक साधारण बात की जरूरत नहीं है। बस बाश और उसके पैरामीटर विस्तार का उपयोग करें :

shopt -s extglob         # Turn on extended globbing.
echo "${TEST##rev*(0)}"  # Remove everything from the beginning up to `rev`
                         # followed by the maximal number of zeroes.

5

POSIXly:

test='rev00000010'
number=${test#"${test%%[1-9]*}"}

बाईं-सबसे गैर-शून्य अंक के बाईं ओर हर चीज को हटा देगा।

Bournely / सार्वभौमिक:

number=`expr "x$test" : 'xrev0*\(.*\)'`

पहले डॉट्स, हेक्स, रिक्त स्थान, आदि के साथ टूट test='rev 003A0.1056'जाएगा : उत्पादन करेगा number="3A0.1056"। दूसरा किसी भी स्थान पर टूट जाएगा, एक ही मूल्य का उत्पादन होगा: 003A0.1056एक्सपायर से।

3

यदि आपके पास पहले से ही चर परीक्षण है, तो इसे हटाए गए सभी पत्र के साथ प्रिंट करें

printf "%.0f\n" ${TEST//[a-z]/}

या

printf "%g\n" ${TEST//[a-z]/}

अग्रणी के साथ %dया echo-andand नंबर का उपयोग न करें के 0रूप में समझा जाता हैoctal


2

कुछ और विकल्प (हालांकि मैं आपको @choroba द्वारा सुझाए गए पैरामीटर विस्तार का उपयोग करने की भी सलाह देता हूं):

  • अंतिम दो वर्णों के साथ अंतिम दो वर्णों का उपयोग करें sedया perlप्रतिस्थापित करें । यह प्रभावी रूप से अंतिम दो को छोड़कर सब कुछ हटा देता है।

    $ sed -r 's/.*(..)/\1/' <<<$TEST
    10
    $ perl -pe 's/.*(..)/\1/' <<<$TEST
    10
    
  • awkफ़ील्ड का परिसीमन 2 या अधिक 0 पर सेट करें और अंतिम फ़ील्ड प्रिंट करें:

    $ awk -F"00+" '{print $NF}' <<<$TEST
    10
    
  • केवल अंतिम दो वर्ण निकालें:

    $ grep -oP '..$' <<<$TEST
    10
    $ perl -lne '/(..)$/; print $1' <<<$TEST
    10
    
  • केवल 10 वीं-अंतिम बाइट्स प्रिंट करें:

    $ cut -b 10- <<<$TEST
    10
    

ध्यान दें कि उपरोक्त सभी उपयोग <<<$varजो बैश निर्माण है। इसे अन्य गोले में उपयोग करने के लिए, में बदलें echo "$TEST" | command


1
अन्य प्रकार के जाग के लिए जो कुछ समस्या से बच सकते हैंawk -F"[a-z]" '{print +$NF}'
कोस्टास

0

"अंतिम संख्या" प्राप्त करने के लिए, स्ट्रिंग के अंत में अंकों के किसी भी क्रम का चयन करें और इसे दशमलव संख्या में परिवर्तित करें:

बैश के साथ:

 [[ "$test" =~  ([1-9][0-9]*)$ ]] && echo "number: $((10#${BASH_REMATCH[1]}))"

ग्रेप के साथ:

echo "$test" | grep -Po "[1-9][0-9]*$"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.