আমি একটি সেড কমান্ডে ভেরিয়েবলগুলি কীভাবে ব্যবহার করব?


266

আমি প্রতিস্থাপন করতে নিচের কোডটি চেষ্টা QQসঙ্গে ZZ, কিন্তু এটা আমি কি চাই না করে না:

var1=QQ
sed -i 's/$var1/ZZ/g' $file

যাইহোক, এই কোডটি আমি যা চাই তা করে:

sed -i 's/QQ/ZZ/g' $file

আমি কীভাবে ভেরিয়েবল ব্যবহার করব sed?



উত্তর:


358

শেলটি ভেরিয়েবল প্রসারণের জন্য দায়ী। আপনি যখন স্ট্রিংয়ের জন্য একক উদ্ধৃতি ব্যবহার করেন, তখন এর বিষয়বস্তুগুলিকে আক্ষরিক সাথে বিবেচনা করা হবে, তাই sedএখন আক্ষরিক প্রতিটি ঘটনাকে প্রতিস্থাপনের চেষ্টা করা $var1হয় ZZ

ডাবল উদ্ধৃতি ব্যবহার

শ্বেতক্ষেত্র সংরক্ষণের সময় শেল প্রসারিত পরিবর্তনশীল করতে ডাবল উদ্ধৃতি ব্যবহার করুন:

sed -i "s/$var1/ZZ/g" "$file"

প্রতিস্থাপনের স্ট্রিংয়ে যখন আপনার উদ্ধৃতি চরিত্রের প্রয়োজন হবে, আপনি এটির আগে একটি ব্যাকস্ল্যাশ দিয়ে যেতে হবে যা শেল দ্বারা ব্যাখ্যা করা হবে। নিম্নলিখিত উদাহরণে, স্ট্রিং quote meপ্রতিস্থাপন করা হবে "quote me"(অক্ষর &দ্বারা ব্যাখ্যা করা হয় sed):

sed -i "s/quote me/\"&\"/" "$file"

একক উদ্ধৃতি ব্যবহার

যদি আপনার প্রচুর শেল মেটা-অক্ষর থাকে তবে প্যাটার্নের জন্য একক উদ্ধৃতি এবং ভেরিয়েবলের জন্য ডাবল উদ্ধৃতিগুলি বিবেচনা করুন:

sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"

s,pattern,replacement,পরিবর্তে আমি কীভাবে ব্যবহার করব তা লক্ষ্য করুন s/pattern/replacement/, /ইন এর সাথে হস্তক্ষেপ এড়াতে এটি করেছি \0/

উদাহরণ

শেলটি sedপরবর্তী আর্গুমেন্ট (ধরে নেওয়া pattern=bertএবং file=text.txt) দিয়ে উপরের কমান্ডটি চালায় :

-i
s,bert,Say hurrah to &: \0/,
text.txt

যদি file.txtএতে থাকে bertতবে আউটপুটটি হবে:

Say hurrah to bert: \0/

2
এই কমা বিচ্ছিন্ন ফর্মটি ব্যবহার করে কেউ কীভাবে "/ g" বিকল্পটি পাস করবে?
ব্লু

6
@ b.long এটি একটি gবিকল্প, যাতে আপনি s,foo,bar,gপরিবর্তে পাস করবে ।
লেকেনস্টেইন

1
আপনার একক উদ্ধৃতি উদাহরণটি বিশেষভাবে কার্যকর, বেশ সুন্দরভাবে রেগেক্স প্যাটার্ন ব্যবহার করে সেডকে কভার করে!
ব্রায়ান থমাস

আপনি যদি এর \\0পরিবর্তে ব্যবহার \0করতে \0প্ররোচিত হন তবে একক উদ্ধৃতিতে আবদ্ধ হয়ে গেলে এটি করা উচিত নয় । অন্যথায় পুরো ম্যাচের পরিবর্তে sedআক্ষরিকের জন্য প্যাটার্নটি স্থান করে দেবে \0
লেকেনস্টেইন

আমার জন্য কৌশলটি।
jimh

114

আমরা sedডাবল উদ্ধৃতি ব্যবহার করে ভেরিয়েবলগুলি ব্যবহার করতে পারি :

sed -i "s/$var/r_str/g" file_name

আপনার যদি /ভেরিয়েবলটিতে স্ল্যাশ থাকে তবে নীচের মতো বিভিন্ন বিভাজক ব্যবহার করুন:

sed -i "s|$var|r_str|g" file_name

7
আপনার যদি চলকটিতে স্ল্যাশ /থাকে => এটি আমাকে বাঁচায়! আমার পরিবর্তনশীলটি একটি ইউআরএল এবং এতে রয়েছে /|বিভাজক হিসাবে ব্যবহার করতে স্যুইচ করা আমার সমস্যাটি স্থির করেছে
Sonlexqt

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