ব্যাশে নেতৃস্থানীয় স্ট্রিং সরান


10

আমার মতো স্ট্রিং রয়েছে rev00000010এবং আমি কেবলমাত্র এই ক্ষেত্রে 10 টির শেষ সংখ্যা চাই।

আমি এটি চেষ্টা করেছি:

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

উভয় কিছুই প্রত্যাবর্তন করে না, যদিও রেজেেক্স সঠিক বলে মনে হচ্ছে ( রেজেক্সারের সাহায্যে চেষ্টা করা হয়েছে )


উত্তর:


16

আপনি যে কমান্ডগুলি পাস করেছেন তা sedবোঝাতে: একটি রেখা যদি রেজেক্সের সাথে মিলে যায় তবে এটি মুছুন । আপনি যা চান তা তা নয়।

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কম্যান্ড বেকোউস নম্বর ব্যবহার করবেন না 0হিসাবে বোঝা যাচ্ছেoctal


2

আরও কয়েকটি বিকল্প (যদিও আমি @ চোরোবার পরামর্শ অনুসারে আপনাকে প্যারামিটার সম্প্রসারণ ব্যবহার করার পরামর্শ দিই):

  • সর্বশেষ দুটি অক্ষর দিয়ে শেষ দুটি অক্ষর ছাড়াও সমস্ত কিছু ব্যবহার sedবা perlপ্রতিস্থাপন করুন । এটি কার্যকরভাবে শেষ দুটি বাদে সবকিছু মুছে দেয়।

    $ sed -r 's/.*(..)/\1/' <<<$TEST
    10
    $ perl -pe 's/.*(..)/\1/' <<<$TEST
    10
    
  • awk2 বা ততোধিক 0 এর ক্ষেত্রের ডিলিমিটার সেট করুন এবং শেষ ক্ষেত্রটি মুদ্রণ করুন:

    $ awk -F"00+" '{print $NF}' <<<$TEST
    10
    
  • কেবলমাত্র শেষ দুটি অক্ষর নিষ্কাশন করুন:

    $ grep -oP '..$' <<<$TEST
    10
    $ perl -lne '/(..)$/; print $1' <<<$TEST
    10
    
  • কেবলমাত্র দশম-শেষ বাইটগুলি মুদ্রণ করুন:

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

নোট করুন যে উপরের সমস্ত ব্যবহার <<<$varযা বাশ নির্মাণ ruct এটি অন্যান্য শেলগুলিতে ব্যবহার করতে, এতে পরিবর্তন করুন 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]*$"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.