আমার "আমি সুজি এবং বিয়ে" পছন্দ করি এবং আমি "সুজি" কে "সারা" তে পরিবর্তন করতে চাই।
#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
# do something...
ফলাফলটি অবশ্যই এর মতো হওয়া উচিত:
firstString="I love Sara and Marry"
আমার "আমি সুজি এবং বিয়ে" পছন্দ করি এবং আমি "সুজি" কে "সারা" তে পরিবর্তন করতে চাই।
#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
# do something...
ফলাফলটি অবশ্যই এর মতো হওয়া উচিত:
firstString="I love Sara and Marry"
উত্তর:
কোনও প্রদত্ত স্ট্রিং সহ কোনও প্যাটার্নের প্রথম উপস্থিতিটি প্রতিস্থাপন করতে :${parameter/pattern/string}
#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
echo "${firstString/Suzi/$secondString}"
# prints 'I love Sara and Marry'
সমস্ত উপস্থিতি প্রতিস্থাপন করতে , ব্যবহার করুন :${parameter//pattern/string}
message='The secret code is 12345'
echo "${message//[0-9]/X}"
# prints 'The secret code is XXXXX'
(এই নথিভুক্ত করা ব্যাশ রেফারেন্স ম্যানুয়াল , §3.5.3 "শেল প্যারামিটার সম্প্রসারণ" ।)
নোট করুন যে এই বৈশিষ্ট্যটি পসিক্স দ্বারা নির্দিষ্ট করা হয়নি - এটি একটি বাশ এক্সটেনশান - সুতরাং সমস্ত ইউনিক্স শেল এটি প্রয়োগ করে না। সম্পর্কিত পসিএক্স ডকুমেন্টেশনের জন্য ওপেন গ্রুপের প্রযুক্তিগত স্ট্যান্ডার্ড বেসের বিশেষ উল্লেখ, ইস্যু 7 , শেল এবং ইউটিলিটিস ভলিউম, .62.6.2 "প্যারামিটার সম্প্রসারণ" দেখুন ।
\n
সেই প্রসঙ্গে নিজেকে প্রতিনিধিত্ব করবে, কোনও নতুন লাইন নয়। আমার কাছে এখনই পরীক্ষার জন্য বাশ হস্ত নেই, তবে আপনার মতো কিছু লিখতে সক্ষম হওয়া উচিত $STRING="${STRING/$'\n'/<br />}"
। (যদিও আপনি সম্ভবত চান STRING//
- প্রতিস্থাপন সব - শুধু বদলে STRING/
।)
echo ${my string foo/foo/bar}
। আপনার প্রয়োজনinput="my string foo"; echo ${input/foo/bar}
//
সরাসরি উল্লেখ করার পরিবর্তে এটি "কীভাবে প্যাটার্নটি ' /
'" দিয়ে শুরু হয় তা ঘটে যা উল্লেখ করে (যা এমনকি সঠিক নয়, যেহেতু বাক্যটির বাকী /
অংশ ধরে নেওয়া হয় যে অতিরিক্তটি আসলে অংশের অংশ নয় প্যাটার্ন) - তবে আমি এর চেয়ে ভাল উত্সটি জানি না।
এটি পুরোপুরি বাশ স্ট্রিং ম্যানিপুলেশন দ্বারা সম্পন্ন করা যেতে পারে:
first="I love Suzy and Mary"
second="Sara"
first=${first/Suzy/$second}
এটি কেবল প্রথম ঘটনাটি প্রতিস্থাপন করবে; সেগুলি প্রতিস্থাপন করতে, প্রথম স্ল্যাশ দ্বিগুণ করুন:
first="Suzy, Suzy, Suzy"
second="Sara"
first=${first//Suzy/$second}
# first is now "Sara, Sara, Sara"
ড্যাশের জন্য পূর্ববর্তী সমস্ত পোস্ট কাজ করছে না
পসিক্স sh
সুসংগত সমাধানটি হ'ল:
result=$(echo "$firstString" | sed "s/Suzi/$secondString/")
result=$(echo $firstString | sed "s/Suzi/$secondString/g")
echo
যুক্তির চারপাশে হারিয়ে যাওয়া উক্তিগুলিও যুক্ত করেছি । এটি সাধারণ স্ট্রিংয়ের সাথে উদ্ধৃতি না দিয়ে ছদ্মবেশে কাজ করে তবে সহজেই কোনও অনিয়ন্ত্রিত ইনপুট স্ট্রিং (অনিয়মিত ফাঁক, শেল মেটাচার্যাক্টর ইত্যাদি) ভেঙে যায়।
এটা চেষ্টা কর:
sed "s/Suzi/$secondString/g" <<<"$firstString"
sed
স্ট্রিংগুলিতে রেজিপ্যাক্সের অক্ষর থাকলে বাশ ব্যবহার করা ভাল ।
echo ${first_string/Suzi/$second_string}
এটি উইন্ডোজে পোর্টেবল এবং কমপক্ষে পুরানো বাশ 3.1 এর সাথে কাজ করে।
আপনার পালানোর বিষয়ে খুব বেশি চিন্তা করার দরকার নেই তা দেখানোর জন্য আসুন এটি চালু করুন:
/home/name/foo/bar
এটিতে:
~/foo/bar
তবে কেবল যদি /home/name
শুরুতে থাকে। আমাদের দরকার নেই sed
!
প্রদত্ত যে বাশ আমাদের যাদু ভেরিয়েবলগুলি দেয় $PWD
এবং $HOME
আমরা করতে পারি:
echo "${PWD/#$HOME/\~}"
সম্পাদনা: উদ্ধৃতি / পালানোর বিষয়ে নোটের মন্তব্যে মার্ক হাফারক্যাম্পের জন্য ধন্যবাদ ~
*
ভেরিয়েবলটিতে কীভাবে $HOME
স্ল্যাশ রয়েছে তা নোট করুন কিন্তু এতে কোনও কিছুই ভাঙ্গেনি।
আরও পড়ুন: অ্যাডভান্সড ব্যাশ-স্ক্রিপ্টিং গাইড ।
যদি ব্যবহার sed
করা আবশ্যক হয় তবে প্রতিটি চরিত্রের হাত থেকে বাঁচতে ভুলবেন না ।
sed
সঙ্গে pwd
কমান্ড একটি নতুন পরিবর্তনশীল প্রতিটি সময় সংজ্ঞা আমার কাস্টম এড়াতে $PS1
রান। বাশ কি স্ট্রিং প্রতিস্থাপনের জন্য কমান্ডের আউটপুট ব্যবহার করার জন্য যাদু ভেরিয়েবলের চেয়ে আরও সাধারণ উপায় সরবরাহ করে? আপনার কোড হিসাবে, আমাকে ~
বাশকে $ ঘরে প্রসারিত করা থেকে বাঁচতে বাঁচতে হয়েছিল । এছাড়াও, #
আপনার আদেশে কি করে?
~
: খেয়াল করুন কীভাবে আমি স্টাফ উদ্ধৃত করেছি। সর্বদা জিনিস উদ্ধৃতি মনে রাখবেন! এবং এটি কেবল যাদু ভেরিয়েবলের জন্যই কাজ করে না: কোনও ভেরিয়েবল প্রতিস্থাপনের ক্ষেত্রে স্ট্রিং দৈর্ঘ্য এবং আরও অনেক কিছু পেতে সক্ষম। আপনার $PS1
দ্রুত চেষ্টা করার জন্য অভিনন্দন : আপনি $PROMPT_COMMAND
যদি অন্য প্রোগ্রামিং ভাষায় আরও স্বাচ্ছন্দ্য বোধ করেন এবং একটি সংকলিত প্রম্পট কোড করতে চান তবে আপনার আগ্রহীও হতে পারে।
echo "${PWD/#$HOME/~}"
আমার $HOME
সাথে প্রতিস্থাপন করবেন না ~
। প্রতিস্থাপন করা হচ্ছে ~
সঙ্গে \~
বা '~'
কাজ করে। এই 4.4.5.5 বাশ এ অন্য কোনও ডিস্ট্রোতে কোনও কাজ। ~
আরও ভাল সামঞ্জস্যের জন্য আপনি উদ্ধৃতি দিতে বা এড়াতে দয়া করে আপনার পোস্টটি আপডেট করতে পারেন ? আমার "ম্যাজিক ভেরিয়েবল" প্রশ্নটি দ্বারা আমি কী বোঝাতে চাইছিলাম: আমি কি বাশের পরিবর্তনশীল বিকল্পটি ব্যবহার করতে পারি, উদাহরণস্বরূপ, uname
এটিকে প্রথমে পরিবর্তনশীল হিসাবে সংরক্ষণ না করে আউটপুট ব্যবহার করতে পারি ? আমার ব্যক্তিগত হিসাবে $PROMPT_COMMAND
, এটি জটিল ।
আগামীকাল যদি আপনি সিদ্ধান্ত নেন আপনি বিবাহকে পছন্দ করেন না হয় সে পাশাপাশি প্রতিস্থাপন করা যেতে পারে:
today=$(</tmp/lovers.txt)
tomorrow="${today//Suzi/Sara}"
echo "${tomorrow//Marry/Jesica}" > /tmp/lovers.txt
আপনার প্রেমিককে ছেড়ে যাওয়ার 50 টি উপায় থাকতে হবে।
যেহেতু আমি কোনও মন্তব্য যুক্ত করতে পারি না। @ruaka উদাহরণটি আরও পঠনযোগ্য করে তুলতে এটি লিখুন
full_string="I love Suzy and Mary"
search_string="Suzy"
replace_string="Sara"
my_string=${full_string/$search_string/$replace_string}
or
my_string=${full_string/Suzy/Sarah}
বিশুদ্ধ POSIX শেল পদ্ধতি, যা অসদৃশ রোমান Kazanovskyi এর sed
ভিত্তিক উত্তর কোন বহিরাগত সরঞ্জাম প্রয়োজন, শুধু শেল নিজস্ব নেটিভ প্যারামিটার প্রসারণও । নোট করুন যে দীর্ঘ ফাইলের নামগুলি হ্রাস করা হয়েছে তাই কোডটি একটি লাইনে আরও ভাল ফিট করে:
f="I love Suzi and Marry"
s=Sara
t=Suzi
[ "${f%$t*}" != "$f" ] && f="${f%$t*}$s${f#*$t}"
echo "$f"
আউটপুট:
I love Sara and Marry
কিভাবে এটা কাজ করে:
ক্ষুদ্রতম প্রত্যয় প্যাটার্ন সরান। "${f%$t*}"
আয় " I love
" যদি প্রত্যয় $t
" Suzi*
" হয় $f
" "। I love
Suzi and Marry
তবে যদি t=Zelda
, তবে "${f%$t*}"
কিছুই মুছে না, এবং পুরো স্ট্রিং " I love Suzi and Marry
" প্রদান করে।
এটি পরীক্ষার জন্য ব্যবহৃত হয় যা $t
এর $f
সাথে থাকে কিনা যদি সেই স্ট্রিংটিতে সত্যটি[ "${f%$t*}" != "$f" ]
মূল্যায়ন করা হয় যদি $f
স্ট্রিংটি " Suzi*
" থাকে এবং মিথ্যা না থাকে।
যদি পরীক্ষাটি সত্য হয় , " " ছোট ছোট প্রত্যয় প্যাটার্ন সরান${f%$t*}
" I love
" ব্যবহার করে পছন্দসই স্ট্রিংটি তৈরি করুন এবং " " দ্বিতীয় স্ট্রিংয়ের মধ্যে " " সাথে ছোট্ট উপসর্গ প্যাটার্নটি ${f#*$t}
" and Marry
" সরান ।$s
Sara
আমি জানি এটি পুরানো তবে যেহেতু কেউ অ্যাজকি ব্যবহারের কথা উল্লেখ করেনি:
firstString="I love Suzi and Marry"
echo $firstString | awk '{gsub("Suzi","Sara"); print}'
echo [string] | sed "s/[original]/[target]/g"