একটি ভেরিয়েবল ব্যবহার করে শেল স্ক্রিপ্টে একটি স্ট্রিং প্রতিস্থাপন করুন


94

আমি শেল স্ক্রিপ্টের ভিতরে একটি স্ট্রিং প্রতিস্থাপনের জন্য নীচের কোডটি ব্যবহার করছি।

echo $LINE | sed -e 's/12345678/"$replace"/g'

তবে এটি পরিবর্তকের $replaceমান পরিবর্তে পরিবর্তিত হচ্ছে।

কেউ কি বলতে পারে কি ভুল হয়েছে?


তাদের মধ্যে স্ল্যাশ সঙ্গে মান হ্যান্ডলিং সম্পর্কে সাধারণ সংশ্লিষ্ট প্রশ্ন জন্য, দেখুন stackoverflow.com/questions/5864146/use-slashes-in-sed-replace
tripleee

উত্তর:


147

আপনি যদি ব্যাখ্যা করতে চান তবে আপনার $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/


আমি চাই না যে কোটগুলি রাখা হোক i আমি চাই একটি নম্বর অন্যের সাথে প্রতিস্থাপন করা হোক
বিজয়

4
প্যাক্সিডাব্লো: setএটিও প্রয়োজনীয় নয় (এবং আপনি কীভাবে এটি ব্যবহার করতে যাচ্ছেন?)। শুধু replace=987654321
রোমান চ্যাপ্লিয়াকা

আমি সবসময় exportশিশুদের জন্য ভেরিয়েবল সেট করা হয় তা নিশ্চিত করার জন্য ব্যবহার করি তবে আপনি যেমন বলে থাকেন ঠিক তেমন সহজেই এড়াতে পারতেন। তবে, ব্যবহার বা না করার exportবিষয়টি এখানে অপ্রাসঙ্গিক (একটি স্টাইল ইস্যু) এবং আসল উত্তরের উপর কোনও প্রভাব নেই, এটি হ'ল কীভাবে কোনও sedকমান্ডের মধ্যে ভেরিয়েবল ব্যবহার করা যায় ।
প্যাক্সডিয়াবল্লো

এই সমাধানটি -iবিকল্পটির সাথে কাজ করছে বলে মনে হচ্ছে না । তুমি জানো কেন? বা কিভাবে এটি কাজ করতে?
গ্যাব্রিয়েল

4
হয়তো আরো নির্দেশ অনুযায়ী একক থেকে উদ্ধৃতি চিহ্ন স্যুইচ কোন প্রয়োজন $বা `মধ্যে sedস্ক্রিপ্ট ডাবল উদ্ধৃতিচিহ্ন সহ পংক্তি জন্য শেল এর প্রতিকল্পন প্রক্রিয়া থেকে রক্ষা করার জন্য একটি ব্যাকস্ল্যাশ সঙ্গে পলান করা।
ট্রিপলি

74

আপনি শেল (ব্যাশ / কেএসএস) ব্যবহার করতে পারেন।

$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc

4
এটি বাশ-নির্দিষ্ট (এবং ksh?) উল্লেখ করতে চাই। সম্ভবত বেশিরভাগ লোকের কাছে আমদানি করা নয় তবে আমাদের মধ্যে কিছু এখনও প্রাচীন ইউনিক্স :-)
প্যাক্সিডিয়াবলো

6
সাবধান, এটি ড্যাশগুলিতেও ব্যর্থ হয় যা /bin/shঅনেক আধুনিক লিনাক্সে রয়েছে।
ফিহাগ

28

প্রশ্নের সাথে সুনির্দিষ্ট নয়, তবে পূর্বের উত্তরগুলি থেকে স্পষ্টতার জন্য একই ধরণের কার্যকারিতা প্রসারিত হওয়া লোকেদের জন্য:

# 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


8

একক উদ্ধৃতি খুব শক্তিশালী। একবার ভিতরে, পরিবর্তে ডাবল উদ্ধৃতি ব্যবহার করুন:

echo $LINE | sed -e "s/12345678/$replace/g"

4
echo $LINE | sed -e 's/12345678/'$replace'/g'

আপনি এখনও একক উদ্ধৃতি ব্যবহার করতে পারেন, তবে ভেরিয়েবলটি সঠিক জায়গায় প্রসারিত করতে চাইলে আপনাকে সেগুলি "খুলতে হবে"। অন্যথায় স্ট্রিংটি "আক্ষরিক" নেওয়া হয়েছে (@ প্যাক্সিডিয়াব্লো সঠিকভাবে বলেছে যে, তার উত্তরও সঠিক)


$replaceএটিতে সমস্যা রয়েছে যে কোনও উদ্ধৃতিগুলির বাইরে ব্যবহারের ফলে শেলটি শ্বেত স্পেস টোকনাইজেশন এবং মানের সাথে ওয়াইল্ডকার্ড সম্প্রসারণ করতে পারে। এটি সাধারণ মানগুলির সাথে কাজ করে প্রদর্শিত হবে, তবে অযৌক্তিক স্ট্রিংগুলিতে নাটকীয়ভাবে ফুটিয়ে উঠতে পারে। এটি প্রোডাকশন কোডে ব্যবহার করবেন না।
ট্রিপলি

2

আপনার শেলটি পরিবর্তনশীল প্রসারিত করতে, আপনার পছন্দ মতো ডাবল-কোট ব্যবহার করতে হবে

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

0

আমার এটির অনুরূপ প্রয়োজন ছিল তবে আমার প্রতিস্থাপন ভারে একটি অ্যাম্পারস্যান্ড রয়েছে। এম্পারস্যান্ডটি এভাবে বেরিয়ে আসা আমার সমস্যার সমাধান করেছে:

replace="salt & pepper"
echo "pass the salt" | sed "s/salt/${replace/&/\&}/g"

-1

পরিবর্তে এটি ব্যবহার করুন

echo $LINE | sed -e 's/12345678/$replace/g'

এটি আমার পক্ষে কেবল উদ্ধৃতিগুলি সরাতে কাজ করে


-2

আমি ডাবল উক্তি ব্যবহার করতে পছন্দ করি, কারণ একক কোয়াটগুলি খুব শক্তিশালী কারণ আমরা যদি তাদের ভিতরে কোনও পরিবর্তন করতে না পারি বা পরিবর্তনশীল বিকল্পটি প্রার্থনা করতে পারি তবে আমরা সেগুলি ব্যবহার করি।

সুতরাং ইনস্টলযুক্ত ডাবল উদ্ধৃতি ব্যবহার করুন।

echo $LINE | sed -e "s/12345678/$replace/g"

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