এটি একটি পুরানো প্রশ্ন, তবে এখানে উত্তরগুলির s/from/to/
মধ্যে কোনওটিই বিশদ বিবরণ ব্যতীত অপারেশন সম্পর্কে আলোচনা করে না।
একটি sed
বিবৃতি সাধারণ ফর্ম হয়
*address* *action*
যেখানে ঠিকানাটি একটি রেজেক্স ব্যাপ্তি বা একটি লাইন সংখ্যা ব্যাপ্তি হতে পারে (বা খালি, এক্ষেত্রে প্রতিটি ইনপুট লাইনে ক্রিয়া প্রয়োগ করা হয়)। উদাহরণস্বরূপ
sed '1,4d' file
4 মাধ্যমে লাইন 1 মুছবে ( ঠিকানা লাইন সংখ্যা পরিসীমা 1,4
এবং কর্ম হয় d
ডিলিট কমান্ড); এবং
sed '/ick/,$s/foo/bar/' file
প্রথম সংঘটন প্রতিস্থাপন করবে foo
সঙ্গে bar
Regex প্রথম ম্যাচে মধ্যে কোনো লাইনে ick
এবং ফাইল শেষে ( ঠিকানা পরিসর /ick/,$
এবং কর্ম হয় s
বিকল্প কমান্ড s/foo/bar/
)।
এই প্রসঙ্গে, যদি ick
কোনও ভেরিয়েবল থেকে আসে তবে আপনি করতে পারেন
sed "/$variable/,\$s/foo/bar/"
(এককটির পরিবর্তে ডাবল উদ্ধৃতিগুলির ব্যবহার লক্ষ্য করুন, যাতে শেলটি ভেরিয়েবলটি ইন্টারপোলেট করতে পারে, এবং ডাবল কোটের ভিতরে আক্ষরিক ডলার চিহ্নটি উদ্ধৃত করার প্রয়োজনীয়তা হয়) তবে যদি ভেরিয়েবলটিতে স্ল্যাশ থাকে তবে আপনি একটি বাক্য গঠন ত্রুটি পাবেন। (শেলটি ভেরিয়েবলটি প্রসারিত করে, এরপরে ফলাফলটি স্ট্রিংটি এতে প্রবাহিত করে sed
; সুতরাং sed
কেবল আক্ষরিক পাঠ্যই দেখে - এতে শেলের ভেরিয়েবলগুলির কোনও ধারণা নেই))
নিরাময়টি হ'ল আলাদা ডিলিমিটার ব্যবহার করা (যেখানে স্পষ্টতই আপনাকে এমন একটি অক্ষর ব্যবহার করতে সক্ষম হতে হবে যা ভেরিয়েবলের মান হতে পারে না) তবে এর বিপরীতে s%foo%bar%
, যদি আপনি অন্যটি ব্যবহার করতে চান তবে আপনারও ডিলিমেটারের আগে একটি ব্যাকস্ল্যাশ প্রয়োজন you ডিফল্টের চেয়ে সীমানা /
:
sed "\\%$variable%,\$s/foo/bar/" file
(একক উদ্ধৃতিগুলির ভিতরে, একটি একক ব্যাকস্ল্যাশ স্পষ্টতই যথেষ্ট হবে); অথবা আপনি প্রতিটি স্ল্যাশ পৃথকভাবে মূল্য থেকে পালাতে পারেন। এই নির্দিষ্ট বাক্য গঠনটি কেবলমাত্র বাশ:
sed "/${variable//\//\\/}/,\$s/foo/bar/" file
অথবা আপনি যদি অন্য শেল ব্যবহার করেন তবে চেষ্টা করুন
escaped=$(echo "$variable" | sed 's%/%\\/%g')
sed "s/$escaped/,\$s/foo/bar/" file
স্পষ্টতার জন্য, যদি $variable
স্ট্রিংটি থাকে 1/2
তবে উপরের কমান্ডগুলির সমতুল্য হবে
sed '\%1/2%,$s/foo/bar/' file
প্রথম ক্ষেত্রে, এবং
sed '/1\/2/,$s/foo/bar/' file
দ্বিতীয় মধ্যে।