ব্যাশ ব্যবহার করে ভেরিয়েবল থেকে নির্দিষ্ট অক্ষর মুছে ফেলুন


122

এটিকে বিন্দু ( ) মুক্ত করতে আমি একটি পরিবর্তনশীল (আমার ক্ষেত্রে এটি বিকাশ কিট সংস্করণ) পার্স করতে চাই .। যদি version='2.3.3', কাঙ্ক্ষিত আউটপুট হয় 233

আমি নীচের মতো চেষ্টা করেছি, তবে এটির .পরিবর্তে আমাকে অন্য চরিত্রটি দিয়ে প্রতিস্থাপন করা দরকার 2_3_3tr . ''কাজ করলে ভাল হত।

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _

10
না, এটা প্রয়োজন হয় না: echo "2.3.3" | tr -d .
manatwork

1
@ মান্যাটওয়ার্ক দুর্দান্ত, এটি কার্যকর। আপনি উত্তর হিসাবে এটি পোস্ট করতে পারেন। ধন্যবাদ
প্রেয়াগাপড

1
অনেক ভাল উত্তর। তবে আমি যদি দ্বিতীয় উদ্দেশ্যটি অনুমান করতে পারি তবে ২.১১.৩ এবং ২.১.১৩ সম্পর্কে সতর্ক হতে হবে ... ;-) সংখ্যায় প্যাডিং শূন্যগুলি যোগ করার বিষয়ে বিবেচনা করুন।
রমানো

1
@ রমনো আপনি কি এমন কিছু বোঝাতে চাইছেন VERSION='2.30.3100'? কোন ব্যাপার ঠিক কি .'র উত্তর এখানে সব সরিয়ে ফেলা হয়।
1313 এ 16:30 এ প্রার্থনা করুন :

2
@ প্রিয়াগআপডি --- আমি কেবল বোঝাতে চাইছি যে আপনি যদি তুলনার জন্য রূপান্তর করার পরে নম্বরটি ব্যবহার করেন ("যদি এই সংস্করণটি আরও নতুন বা এটির মতো হয়" তবে) আপনার যদি ২.১১.৩ এবং ২.১.১৩ এর মতো মামলার যত্ন নেওয়া উচিত - - বিন্দু অপসারণের পরে এগুলি একই মনে হয় তবে স্পষ্টভাবে 2.11.3 আরও নতুন। এছাড়াও, 2.11.3 2.1.14 এর চেয়ে নতুন, তবে 2113 এবং 2114 এর তুলনা করা ভুল উত্তর নিয়ে যাবে। আমি এর জন্য কোথাও একটি বাগ স্মরণ করছি ...
রোমানো

উত্তর:


135

বাহ্যিক প্রোগ্রাম চালানোর দরকার নেই। bashএর স্ট্রিং ম্যানিপুলেশন এটি পরিচালনা করতে পারে (এটি উপস্থিত ksh(যেখানে থেকে আসে) এবং zsh):

$ VERSION='2.3.3'
$ echo "${VERSION//.}"
233

(এই শেলগুলির ম্যানুয়ালগুলিতে আপনি এটি প্যারামিটার সম্প্রসারণ বিভাগে সন্ধান করতে পারেন))


19
আরও বিশদের জন্য, উপরের উত্তরের বাক্য গঠনটি হ'ল ${string//substring/replacement}, যেখানে দৃশ্যত চূড়ান্ত ফরোয়ার্ড স্ল্যাশ এবং প্রতিস্থাপনের স্ট্রিংয়ের অভাবটি মুছে ফেলা হিসাবে ব্যাখ্যা করা হয় । এখানে দেখুন ।
sherrellbc

5
ডান, শেল প্যারামিটার সম্প্রসারণ বিভাগে man bashএটি স্পষ্টভাবে বলেছে : " (…) যদি স্ট্রিংটি শূন্য হয়, প্যাটার্নের মিলগুলি মুছে ফেলা হয় এবং নিম্নলিখিত প্যাটার্নটি বাদ দেওয়া যেতে পারে” "${parameter/pattern/string}/
মানট ওয়ার্ক

1
আমার সমস্যাটি হ'ল সংস্করণ নম্বরটি এইভাবে এসেছিল "1.0.0"এবং আমি ঠিক সেই সংখ্যাটি চেয়েছিলাম যাতে @ ম্যানটওয়ার্কের পরামর্শ অনুসারে আমি কী পরিবর্তন করেছি: "${VERSIONNUM//'"'}"তবে আমি সন্নিবেশ করলাম ' ' কারণ অন্যথায় এটি ""স্ট্রিংটি বন্ধ করতে স্বীকৃতি দেয় না ।
অ্যালেক্সিস্যানি

1
@ অ্যালেক্সিসান্নি, আপনি বলতে চাচ্ছেন আক্ষরিক "মূল্য আছে? আমি এইটিকে নতুন প্রশ্ন হিসাবে গণ্য করতে ভয় পাচ্ছি, তবে কেবল ডাবলকোটটি থেকে পালানোর চেষ্টা করুন: "${VERSIONNUM//\"}" পেস্টবিন.
com/

1
চমত্কার !! -ashখুব কাজ করে !
Fr0zenFyr

87

কালানুক্রমিক ক্রম অনুসারে:

TR / কিন্তু

echo "$VERSION" | tr -d .
echo "$VERSION" | sed 's/\.//g'

তবে csh এর মূল / tcsh শেল

echo $VERSION:as/.//

পসিক্স শেল:

set -f
IFS=.
set -- $VERSION
IFS=
echo "$*"

ksh / zsh / bash / yash (এবং এর ashসাথে নির্মিত হলে ব্যস্তবক্স ASH_BASH_COMPAT)

echo "${VERSION//.}"

zsh

echo $VERSION:gs/./

1
tr -d সেট থেকে এমনকি একক চর মুছে ফেলা। প্রাক্তনের জন্য আমি "ডিসিসি_ ভার্সনডি" থেকে ডিসিসি_ মুছতে চাই, এটি ডিসিসি এবং ডি মুছে ফেলে প্রত্যাশিত আউটপুট: সংস্করণডি। আসল আউটপুট: সংস্করণ। সেড একটি কবজ মত কাজ করে। :) পোস্টের জন্য ধন্যবাদ.
কেলে

20

সফল উত্তর ছাড়াও ইতিমধ্যে বিদ্যমান। একই জিনিস সঙ্গে অর্জন করা যেতে পারে trসঙ্গে, --deleteবিকল্প।

echo "2.3.3" | tr --delete .

যা আউটপুট দেবে: 233


6
ম্যাকোসে --deleteপতাকাটি স্বীকৃত নয়, তবে আপনি এর -dপরিবর্তে ব্যবহার করতে পারেন
অ্যানেন্ট্রপিক

6

sedপরিবর্তে আপনি চেষ্টা করা উচিত

sed 's/\.//g'


4
echo "$VERSION" | tr -cd [:digit:]

এটি কেবলমাত্র অঙ্কগুলি ফিরিয়ে আনবে, অন্য চরিত্রের উপস্থিতি নির্বিশেষে


4

পার্ল

$ VERSION='2.3.3'                                     
$ perl -pe 's/\.//g' <<< "$VERSION"           
233

পাইথন

$ VERSION='2.3.3'                                     
$ python -c 'import sys;print sys.argv[1].replace(".","")' "$VERSION"
233

যদি $VERSIONকেবল অঙ্ক এবং বিন্দু থাকে তবে আমরা আরও ছোট কিছু করতে পারি:

$ python -c 'print "'$VERSION'".replace(".","")'
233

(এটি কোনও কোড ইনজেকশন দুর্বলতা সম্পর্কে সতর্ক হন যদিও $VERSIONএতে কোনও অক্ষর থাকতে পারে)।

awk

$ VERSION='2.3.3'
$ awk 'BEGIN{gsub(/\./,"",ARGV[1]);print ARGV[1]}' "$VERSION"
233

অথবা এটা:

$ awk '{gsub(/\./,"")}1' <<< "$VERSION"
233
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.