سؤال كيف أستخدم المتغيرات في أمر sed؟


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

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

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

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

كيف أستخدم المتغيرات في sed؟


179
2017-11-07 16:30


الأصل


نرى جوابي في هذا المنصب لك - ata
ذات صلة: stackoverflow.com/questions/407523/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


الأجوبة:


الصدفة مسؤولة عن توسيع المتغيرات. عند استخدام علامات الاقتباس المفردة للسلاسل ، سيتم معالجة محتوياتها حرفياً ، لذلك sed يحاول الآن استبدال كل تكرار للحرفي $var1 بواسطة ZZ.

باستخدام علامات الاقتباس المزدوجة

استخدم علامات الاقتباس المزدوجة لتجعل القشرة توسع من المتغيرات مع الحفاظ على المسافات البيضاء:

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

عندما تحتاج إلى حرف الاقتباس في سلسلة الاستبدال ، يجب عليك أن تسبقه بخط مائل عكسي والذي سيتم تفسيره بواسطة shell. في المثال التالي ، السلسلة 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/.

مثال

shell ثم تشغيل الأمر أعلاه sed مع الحجج القادمة (على افتراض pattern=bert و file=text.txt):

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

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

Say hurrah to bert: \0/

253
2017-11-07 17:20



كيف يمكن للمرء أن يمرر الخيار "/ g" باستخدام هذا النموذج المفصول بفواصل؟ - blong
@ ب g الخيار ، لذلك كنت سوف تمر s,foo,bar,g في حين أن. - Lekensteyn
مثال التسعير المفرد الخاص بك مفيدا بشكل خاص ، ويغطي sed باستخدام نمط regex بشكل جميل! - Brian Thomas
في حال كنت تحاول استخدام \\0 بدلا من \0، لا ينبغي أن يتم ذلك عندما \0 مضمنة في علامات اقتباس مفردة. غير ذلك sed سوف تحل محل نمط حرفيا \0 بدلا من المباراة كلها. - Lekensteyn


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

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

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

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

79
2017-08-07 15:29