كيف يمكنني استخدام المتغيرات في أمر الحوار الاقتصادي الاستراتيجي?

حاولت التعليمة البرمجية التالية ليحل محل QQ مع ZZ، لكنه لا يفعل ما أريد:

var1=QQsed -i 's/$var1/ZZ/g' $file

ومع ذلك ، هذا الرمز يفعل ما أريد:

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

كيف يمكنني استخدام المتغيرات في sed?

القشرة مسؤولة عن توسيع المتغيرات. عند استخدام علامات الاقتباس المفردة للسلاسل ، سيتم التعامل مع محتوياته حرفيا، لذلك 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):

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

إذا file.txt يحتوي على bert، سيكون الإخراج:

Say hurrah to bert: \0/

يمكننا استخدام المتغيرات في sed استخدام علامات الاقتباس المزدوجة:

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

إذا كان لديك شرطة مائلة / في المتغير ثم استخدام فاصل مختلفة ، مثل أدناه:

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

لتوسيع (يقصد التورية) على @جواب ماني,

  • سيعمل هذا الحل مع التعبيرات العادية التي يتم تغذيتها لأوامر أخرى ، مثل perl
  • استخدم علامات اقتباس مزدوجة حول التعبير العادي (نعم ، حتى في ظل أنظمة أونيكسي) لتوسيع المتغير كما هو متوقع
  • | قد تظهر في قيمة المتغير الخاص بك أيضا، لذلك لا تخف من تجربة المحددات الأخرى

نرى جوابي في هذا المنصب لك

ذات صلة: Escape a string for a sed replace pattern - Stack Overflow