বাশে শেষ বিন্দুর পরে স্ট্রিং প্রতিস্থাপন করুন


12

আমার একটি স্ট্রিংতে একটি নীচের ধরণ রয়েছে (একটি আইপি ঠিকানা):

123.444.888.235

আমি বিন্দুর সাথে শেষ নম্বরটি প্রতিস্থাপন করতে চাই 0, তাই এটি হয়ে যায়:

123.444.888.0

আমি কীভাবে এটি bashঅন্য শেল স্ক্রিপ্টের ভাষায় করতে পারি?


1
সেই স্ট্রিংগুলি কোথায়? বাশ ভেরিয়েবলে? একটি টেক্সট ফাইল প্রতি লাইনে এক?
স্টাফেন চেজেলাস

এটি একটি পরিবর্তনশীল হয়। আমি দুঃখিত এটির কথা ভুলে গিয়েছিলাম।
এরি

3
সেগুলি যদি আইপি ঠিকানা হয় তবে 444 এবং 888 অবৈধ অক্টেট মান।
ডিজিটাল ট্রমা

উত্তর:


24

যে কোনও পসিক্স শেল এ:

var=123.444.888.235
new_var="${var%.*}.0"

${var%pattern}ksh80 এর দশকে প্রবর্তিত একটি অপারেটর , প্রমিত shভাষার জন্য পসিক্স দ্বারা প্রমিত করা হয়েছে এবং এখন সেই ভাষাটি ব্যাখ্যা করে এমন সমস্ত শেল দ্বারা প্রয়োগ করা হয়েছে bash

${var%pattern}বিষয়বস্তুর সাথে বিস্তৃতি $varকম স্ট্রিংটি ম্যাচ কেড়ে প্যাটার্ন তা শেষ (অথবা একই হিসাবে $varযে প্যাটার্ন মেলে না)। সুতরাং ${var%.*}( .*এমন একটি প্যাটার্ন যেখানে এর অর্থ বিন্দু অনুসরণ করে কোনও অক্ষরের সংখ্যা রয়েছে) $varডান-সর্বাধিক ছাড়াই প্রসারিত হয় এবং এটি .কী অনুসরণ করে। বিপরীতে, প্যাটার্নের সাথে মেলে এমন দীর্ঘতম স্ট্রিং ${var%%.*}যেখানে বাম-সর্বাধিক ছাড়াই প্রসারিত হবে এবং এটি কী অনুসরণ করে। $var.


কী ? ${var%.*}
22:38

@ tjt263, কমান্ড লাইনে টাইপ করুন man bashএবং এন্টার টিপুন, তারপরে টাইপ করুন /suffix patternএবং এন্টার টিপুন। :)
ওয়াইল্ডকার্ড

আপনার পোস্ট অনুসরণ করে কিছু উদ্ধৃতি যুক্ত হয়েছে : new_var="${var%.*}.0"... জয় !.

8

এই কাজ করা উচিত.

echo 123.444.888.235 | sed 's/\([0-9]*\.[0-9]*\.[0-9]*\.\)[0-9]*/\10/'

লক্ষ্য করুন যে sedপ্রতিস্থাপনের শেষ ক্ষেত্রটি, \10প্রথম মিলিত প্যাটার্ন ( \1), যা আক্ষরিক শূন্যের সাথে সংমিশ্রিত হয়।


5

কয়েকটি উপায় (এই সমস্তই ধরে নেওয়া যায় যে আপনি স্ট্রিংয়ে সংখ্যার শেষ সেটটি পরিবর্তন করতে চান):

$ echo 123.444.888.235 | awk -F'.' -vOFS='.' '{$NF=0}1;'
123.444.888.0

এখানে, -F'.'বলে awkব্যবহার করতে .ইনপুট ক্ষেত্র বিভাজক হিসেবে এবং -vOFS='.'আউটপুট ক্ষেত্র বিভাজক যেমন ব্যবহার করতে। এর পরে, আমরা কেবল গত ক্ষেত্র (সেট $NF0) এবং লাইন মুদ্রণ ( 1;হয় awk"বর্তমান লাইন প্রিন্ট" জন্য সাধারণভাবে সংক্ষেপে)।

$ echo 123.444.888.235 | perl -pe 's/\d+$/0/'
123.444.888.0

-pবলে perlস্ক্রিপ্ট দেওয়া প্রয়োগের পরে প্রতিটি ইনপুট লাইন প্রিন্ট করতে -e। স্ক্রিপ্টটি নিজেই কেবল একটি সহজ বিকল্প অপারেটর যা লাইনটির শেষে এক বা একাধিক সংখ্যাকে প্রতিস্থাপন করবে 0

$ echo 123.444.888.235 | sed 's/[0-9]*$/0/'
123.444.888.0

পরিবর্তে sedব্যবহার করে একই ধারণা ।[0-9]\d


যদি আপনার স্ট্রিং কোনও পরিবর্তনশীল হয় এবং আপনি এমন শেল ব্যবহার করেন যা এখানে স্ট্রিং সমর্থন করে (যেমন bashবা zshউদাহরণস্বরূপ), আপনি উপরেরটি পরিবর্তন করতে পারেন:

awk -F'.' -vOFS='.' '{$NF=0}1;' <<<$var
perl -pe 's/\d+$/0/' <<<$var
sed 's/[0-9]*$/0/' <<<$var

5

আইপি ঠিকানায় নেটমাস্ক প্রয়োগের জন্য সাধারণ ক্ষেত্রে:

প্রদত্ত যে আপনার ইনপুট একটি IP ঠিকানা, এবং যে আপনার সাথে যে ঠিকানা শেষ অক্টেট প্রতিস্থাপন হচ্ছে যাতে .0, তারপর আমি অনুমান কি হয় সত্যিই অর্জন করার চেষ্টা IP ঠিকানা নেটওয়ার্কের অংশ গনা, ব্যবহার করছে 255.255.255.0নেটমাস্ক।

আপনার নেটমাস্কের দৈর্ঘ্যটি 8 দ্বারা বিভাজ্য থাকলে কেবল জিরোর সাথে অক্টেটগুলি প্রতিস্থাপন করা ঠিক আছে, তবে এটি সাধারণ ক্ষেত্রে নয়। আপনার যদি কোনও বৈধ (সাবনেট) নেটমাস্কের জন্য এই ক্রিয়াকলাপটি চালানোর প্রয়োজন হয় তবে আপনি এই জাতীয় কিছু করতে পারেন:

function d2i() {
    echo $(( 0x$( printf "%02x" ${1//./ } ) ))
}

function i2d() {
    h=$( printf "%08X" "$1" )
    echo $(( 0x${h:0:2} )).$(( 0x${h:2:2} )).$(( 0x${h:4:2} )).$(( 0x${h:6:2} ))
}

function ipmask() {
    i2d $(( $( d2i $1 ) & $( d2i $2 ) ))
}

ipmask 123.44.88.235 255.255.255.0     # outputs 123.44.88.0
ipmask 123.44.88.235 255.255.255.240   # outputs 123.44.88.224

এটি 3 ফাংশন সংজ্ঞায়িত করে:

  • d2i() একটি আইপি ঠিকানার বিন্দু-দশমিক রূপকে (বা মাস্ক) একটি সাধারণ পূর্ণসংখ্যায় রূপান্তর করে
  • i2d() বিপরীত কাজ করে - একটি সাধারণ পূর্ণসংখ্যাকে বিন্দু দশমিককে রূপান্তর করে
  • ipmask()কোনও ঠিকানার নেটওয়ার্ক অংশটি দেওয়ার জন্য কেবল একটি ঠিকানা এবং একটি নেটমাস্কের খানিকটা গণনা করুন। বাশ অপারেশনগুলি &পূর্ণসংখ্যা হিসাবে প্রত্যাশা করে ।

ipmaskদুটি পৃথক মুখোশের আইপি ঠিকানা থেকে নেটওয়ার্ক কীভাবে গণনা করা যেতে পারে তা দেখানোর জন্য দুটি কল ।


প্রশ্নে বর্ণিত হিসাবে নোট, 123.444.888.235একটি অবৈধ আইপি ঠিকানা। আমি 123.44.88.235এই উদাহরণগুলির পরিবর্তে ব্যবহার করেছি ।


0

বিকল্প sedউত্তর:

sed -r 's/(.*\.).*/\10/'

এটি সর্বশেষ বিন্দু পর্যন্ত সমস্ত কিছু ভাগ করে দেয় এবং গোষ্ঠীর সামগ্রীর সাথে সম্পূর্ণ লাইন প্রতিস্থাপন করে 0 অনুসরণ করে।
আমি প্রথম বন্ধনী এড়াতে এড়াতে -r ব্যবহার করি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.