(এখানে এবং যথাক্রমে) s
কমান্ডের বাম দিকে এবং ডানদিকে ব্যবহার করার জন্য ভেরিয়েবলগুলি এড়ানোর জন্য , আপনি:sed
$lhs
$rhs
escaped_lhs=$(printf '%s\n' "$lhs" | sed 's:[][\/.^$*]:\\&:g')
escaped_rhs=$(printf '%s\n' "$rhs" | sed 's:[\/&]:\\&:g;$!s/$/\\/')
sed "s/$escaped_lhs/$escaped_rhs/"
মনে রাখবেন যে $lhs
একটি নতুন লাইন অক্ষর থাকতে পারে না।
অর্থাৎ, এলএইচএসে, সমস্ত রেজিপ্সেপ অপারেটরগুলি ( ][.^$*
), পালিয়ে যাওয়া চরিত্র নিজেই ( \
) এবং বিভাজক ( /
) এড়িয়ে চলুন ।
আরএইচএসে আপনাকে কেবল পালাতে হবে &
, বিভাজক, ব্যাকস্ল্যাশ এবং নিউলাইন চরিত্রটি (যা আপনি সর্বশেষটি ( $!s/$/\\/
) বাদে প্রতিটি লাইনের শেষে একটি ব্যাকস্ল্যাশ সন্নিবেশ করিয়েছেন )।
যা আপনি ব্যবহার অনুমান /
আপনার একটি বিভাজক হিসেবে sed
s
কমান্ড এবং আপনি সক্ষম করবেন না যে এক্সটেন্ডেড মাঝামাঝি সঙ্গে -r
(গনুহ sed
/ ssed
/ ast
/ busybox sed
) অথবা -E
(BSD গুলোর, ast
সাম্প্রতিক গনুহ, সাম্প্রতিক, busybox) অথবা PCREs সঙ্গে -R
( ssed
) অথবা বৃদ্ধি মাঝামাঝি সঙ্গে -A
/ -X
( ast
) যা সবার অতিরিক্ত আরআর অপারেটর রয়েছে।
যথেচ্ছ ডেটা নিয়ে কাজ করার সময় কয়েকটি স্থল নিয়ম:
- ব্যবহার করবেন না
echo
- আপনার পরিবর্তনশীল উদ্ধৃতি
- লোকেলের প্রভাব বিবেচনা করুন (বিশেষত এর চরিত্রের সেট: উদাহরণস্বরূপ পলায়নকারী স্ট্রিংগুলি (এবং একই কমান্ডের সাহায্যে) কমান্ডের মতো একই লোকেলে পালানো
sed
কমান্ডগুলি চালানো গুরুত্বপূর্ণ )sed
sed
- নতুন লাইন চরিত্রটি সম্পর্কে ভুলবেন না (এখানে আপনি
$lhs
কোনও রয়েছে কিনা তা পরীক্ষা করে নিতে এবং পদক্ষেপ নিতে চাইতে পারেন)।
আর একটি বিকল্প হ'ল পরিবেশে স্ট্রিংগুলির perl
পরিবর্তে ব্যবহার sed
এবং পাস করা এবং আক্ষরিকভাবে স্ট্রিং নেওয়ার জন্য \Q
/ \E
perl
regexp অপারেটরগুলি ব্যবহার করা:
A="$lhs" B="$rhs" perl -pe 's/\Q$ENV{A}\E/$ENV{B}/g'
perl
(ডিফল্টরূপে) লোকালের চরিত্রটি দ্বারা প্রভাবিত হবে না উপরের হিসাবে, এটি কেবল স্ট্রিংগুলিকে বাইটের অ্যারে হিসাবে বিবেচনা করে না তারা কোন অক্ষর (যদি থাকে) সেগুলি ব্যবহারকারীর জন্য উপস্থাপন করতে পারে about সঙ্গে sed
, আপনি লোকেল ফিক্সিং একই অর্জন করতে পারে C
সঙ্গে LC_ALL=C
সব জন্য sed
কমান্ড (যদিও যে যদি থাকে, ত্রুটি বার্তা ভাষা প্রভাবিত করবে)।