আমার একটি স্ট্রিংতে একটি নীচের ধরণ রয়েছে (একটি আইপি ঠিকানা):
123.444.888.235
আমি বিন্দুর সাথে শেষ নম্বরটি প্রতিস্থাপন করতে চাই 0
, তাই এটি হয়ে যায়:
123.444.888.0
আমি কীভাবে এটি bash
অন্য শেল স্ক্রিপ্টের ভাষায় করতে পারি?
আমার একটি স্ট্রিংতে একটি নীচের ধরণ রয়েছে (একটি আইপি ঠিকানা):
123.444.888.235
আমি বিন্দুর সাথে শেষ নম্বরটি প্রতিস্থাপন করতে চাই 0
, তাই এটি হয়ে যায়:
123.444.888.0
আমি কীভাবে এটি bash
অন্য শেল স্ক্রিপ্টের ভাষায় করতে পারি?
উত্তর:
যে কোনও পসিক্স শেল এ:
var=123.444.888.235
new_var="${var%.*}.0"
${var%pattern}
ksh
80 এর দশকে প্রবর্তিত একটি অপারেটর , প্রমিত sh
ভাষার জন্য পসিক্স দ্বারা প্রমিত করা হয়েছে এবং এখন সেই ভাষাটি ব্যাখ্যা করে এমন সমস্ত শেল দ্বারা প্রয়োগ করা হয়েছে bash
।
${var%pattern}
বিষয়বস্তুর সাথে বিস্তৃতি $var
কম স্ট্রিংটি ম্যাচ কেড়ে প্যাটার্ন তা শেষ (অথবা একই হিসাবে $var
যে প্যাটার্ন মেলে না)। সুতরাং ${var%.*}
( .*
এমন একটি প্যাটার্ন যেখানে এর অর্থ বিন্দু অনুসরণ করে কোনও অক্ষরের সংখ্যা রয়েছে) $var
ডান-সর্বাধিক ছাড়াই প্রসারিত হয় এবং এটি .
কী অনুসরণ করে। বিপরীতে, প্যাটার্নের সাথে মেলে এমন দীর্ঘতম স্ট্রিং ${var%%.*}
যেখানে বাম-সর্বাধিক ছাড়াই প্রসারিত হবে এবং এটি কী অনুসরণ করে।
$var
.
${var%.*}
man bash
এবং এন্টার টিপুন, তারপরে টাইপ করুন /suffix pattern
এবং এন্টার টিপুন। :)
new_var="${var%.*}.0"
... জয় !.
কয়েকটি উপায় (এই সমস্তই ধরে নেওয়া যায় যে আপনি স্ট্রিংয়ে সংখ্যার শেষ সেটটি পরিবর্তন করতে চান):
$ echo 123.444.888.235 | awk -F'.' -vOFS='.' '{$NF=0}1;'
123.444.888.0
এখানে, -F'.'
বলে awk
ব্যবহার করতে .
ইনপুট ক্ষেত্র বিভাজক হিসেবে এবং -vOFS='.'
আউটপুট ক্ষেত্র বিভাজক যেমন ব্যবহার করতে। এর পরে, আমরা কেবল গত ক্ষেত্র (সেট $NF
0) এবং লাইন মুদ্রণ ( 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
প্রদত্ত যে আপনার ইনপুট একটি 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
এই উদাহরণগুলির পরিবর্তে ব্যবহার করেছি ।