আমি শেল স্ক্রিপ্টের ভিতরে একটি স্ট্রিং প্রতিস্থাপনের জন্য নীচের কোডটি ব্যবহার করছি।
echo $LINE | sed -e 's/12345678/"$replace"/g'
তবে এটি পরিবর্তকের $replace
মান পরিবর্তে পরিবর্তিত হচ্ছে।
কেউ কি বলতে পারে কি ভুল হয়েছে?
আমি শেল স্ক্রিপ্টের ভিতরে একটি স্ট্রিং প্রতিস্থাপনের জন্য নীচের কোডটি ব্যবহার করছি।
echo $LINE | sed -e 's/12345678/"$replace"/g'
তবে এটি পরিবর্তকের $replace
মান পরিবর্তে পরিবর্তিত হচ্ছে।
কেউ কি বলতে পারে কি ভুল হয়েছে?
উত্তর:
আপনি যদি ব্যাখ্যা করতে চান তবে আপনার $replace
একক উদ্ধৃতি ব্যবহার করা উচিত নয় কারণ এগুলি পরিবর্তনশীল প্রতিস্থাপন প্রতিরোধ করে।
চেষ্টা করুন:
echo $LINE | sed -e "s/12345678/\"${replace}\"/g"
ধরে নিচ্ছি যে আপনি উদ্ধৃতিগুলি রেখে দিতে চান you আপনি যদি উদ্ধৃতিগুলি না চান তবে ব্যবহার করুন:
echo $LINE | sed -e "s/12345678/${replace}/g"
প্রতিলিপি:
pax> export replace=987654321
pax> echo X123456789X | sed "s/123456789/${replace}/"
X987654321X
pax> _
এটি নিশ্চিত করার জন্য কেবল সাবধান হন যে (যেমন উদাহরণস্বরূপ) ${replace}
এর কোনও তাত্পর্যপূর্ণ অক্ষর নেই কারণ এটি পালাতে না পারলে বিভ্রান্তি সৃষ্টি করবে। তবে, আপনি যেমনটি বলেছেন, আপনি একটি নম্বর অন্যটির সাথে প্রতিস্থাপন করছেন, সমস্যা হওয়া উচিত নয়।sed
/
set
এটিও প্রয়োজনীয় নয় (এবং আপনি কীভাবে এটি ব্যবহার করতে যাচ্ছেন?)। শুধু replace=987654321
।
export
শিশুদের জন্য ভেরিয়েবল সেট করা হয় তা নিশ্চিত করার জন্য ব্যবহার করি তবে আপনি যেমন বলে থাকেন ঠিক তেমন সহজেই এড়াতে পারতেন। তবে, ব্যবহার বা না করার export
বিষয়টি এখানে অপ্রাসঙ্গিক (একটি স্টাইল ইস্যু) এবং আসল উত্তরের উপর কোনও প্রভাব নেই, এটি হ'ল কীভাবে কোনও sed
কমান্ডের মধ্যে ভেরিয়েবল ব্যবহার করা যায় ।
-i
বিকল্পটির সাথে কাজ করছে বলে মনে হচ্ছে না । তুমি জানো কেন? বা কিভাবে এটি কাজ করতে?
$
বা `
মধ্যে sed
স্ক্রিপ্ট ডাবল উদ্ধৃতিচিহ্ন সহ পংক্তি জন্য শেল এর প্রতিকল্পন প্রক্রিয়া থেকে রক্ষা করার জন্য একটি ব্যাকস্ল্যাশ সঙ্গে পলান করা।
আপনি শেল (ব্যাশ / কেএসএস) ব্যবহার করতে পারেন।
$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc
/bin/sh
অনেক আধুনিক লিনাক্সে রয়েছে।
প্রশ্নের সাথে সুনির্দিষ্ট নয়, তবে পূর্বের উত্তরগুলি থেকে স্পষ্টতার জন্য একই ধরণের কার্যকারিতা প্রসারিত হওয়া লোকেদের জন্য:
# create some variables
str="someFileName.foo"
find=".foo"
replace=".bar"
# notice the the str isn't prefixed with $
# this is just how this feature works :/
result=${str//$find/$replace}
echo $result
# result is: someFileName.bar
str="someFileName.sally"
find=".foo"
replace=".bar"
result=${str//$find/$replace}
echo $result
# result is: someFileName.sally because ".foo" was not found
একটি করুণ সমাধান খুঁজে পেয়েছি ।
echo ${LINE//12345678/$replace}
echo $LINE | sed -e 's/12345678/'$replace'/g'
আপনি এখনও একক উদ্ধৃতি ব্যবহার করতে পারেন, তবে ভেরিয়েবলটি সঠিক জায়গায় প্রসারিত করতে চাইলে আপনাকে সেগুলি "খুলতে হবে"। অন্যথায় স্ট্রিংটি "আক্ষরিক" নেওয়া হয়েছে (@ প্যাক্সিডিয়াব্লো সঠিকভাবে বলেছে যে, তার উত্তরও সঠিক)
$replace
এটিতে সমস্যা রয়েছে যে কোনও উদ্ধৃতিগুলির বাইরে ব্যবহারের ফলে শেলটি শ্বেত স্পেস টোকনাইজেশন এবং মানের সাথে ওয়াইল্ডকার্ড সম্প্রসারণ করতে পারে। এটি সাধারণ মানগুলির সাথে কাজ করে প্রদর্শিত হবে, তবে অযৌক্তিক স্ট্রিংগুলিতে নাটকীয়ভাবে ফুটিয়ে উঠতে পারে। এটি প্রোডাকশন কোডে ব্যবহার করবেন না।
আপনার শেলটি পরিবর্তনশীল প্রসারিত করতে, আপনার পছন্দ মতো ডাবল-কোট ব্যবহার করতে হবে
sed -i "s#12345678#$replace#g" file.txt
$replace
এতে বিশেষ sed
অক্ষর ( #
, \
) থাকলে এটি ভেঙে যাবে । তবে আপনি $replace
সেগুলিকে উদ্ধৃত করতে প্রাক-প্রসেস করতে পারেন :
replace_quoted=$(printf '%s' "$replace" | sed 's/[#\]/\\\0/g')
sed -i "s#12345678#$replace_quoted#g" file.txt
আমার এটির অনুরূপ প্রয়োজন ছিল তবে আমার প্রতিস্থাপন ভারে একটি অ্যাম্পারস্যান্ড রয়েছে। এম্পারস্যান্ডটি এভাবে বেরিয়ে আসা আমার সমস্যার সমাধান করেছে:
replace="salt & pepper"
echo "pass the salt" | sed "s/salt/${replace/&/\&}/g"
পরিবর্তে এটি ব্যবহার করুন
echo $LINE | sed -e 's/12345678/$replace/g'
এটি আমার পক্ষে কেবল উদ্ধৃতিগুলি সরাতে কাজ করে
আমি ডাবল উক্তি ব্যবহার করতে পছন্দ করি, কারণ একক কোয়াটগুলি খুব শক্তিশালী কারণ আমরা যদি তাদের ভিতরে কোনও পরিবর্তন করতে না পারি বা পরিবর্তনশীল বিকল্পটি প্রার্থনা করতে পারি তবে আমরা সেগুলি ব্যবহার করি।
সুতরাং ইনস্টলযুক্ত ডাবল উদ্ধৃতি ব্যবহার করুন।
echo $LINE | sed -e "s/12345678/$replace/g"