عن طريق سد لتوسيع متغيرات البيئة داخل ملفات

StackOverflow https://stackoverflow.com/questions/1609423

  •  05-07-2019
  •  | 
  •  

سؤال

وأود أن استخدام سد لتوسيع المتغيرات داخل الملف.

لنفترض أنني تصدير متغير متغير = شيء، ويكون لديك ملف "اختبار" بما يلي:

I'd like to expand this: "${VARIABLE}"

ولقد كنت تحاول الأوامر كما يلي، ولكن دون جدوى:

cat test | sed -e "s/\(\${[A-Z]*}\)/`eval "echo '\1'"`/" > outputfile

وكانت النتيجة هي "outputfile" مع المتغير لا يزال غير موسع:

I'd like to expand this: "${VARIABLE}"

ومع ذلك، تشغيل eval "echo '${VARIABLE}' في نتائج وحدة باش في "شيء ما" قيمة يجري ردد. أيضا، اختبرت وأن النمط تروللي يجري مطابقة.

وقال إن النتيجة المرجوة يكون

I'd like to expand this: "something"

ويمكن لأي شخص أن تسليط الضوء على هذا؟

هل كانت مفيدة؟

المحلول

والنظر في النسخة التجريبية الخاصة بك:

cat test | sed -e "s/\(\${[A-Z]*}\)/`eval "echo '\1'"`/" > outputfile

والسبب هذا لا يعمل لأنه يتطلب علم الغيب على جزء من قذيفة. يتم إنشاء النصي الحوار الاقتصادي الاستراتيجي قبل يقابل أي نمط من الحوار الاقتصادي الاستراتيجي، وبالتالي فإن قذيفة لا تستطيع أن تفعل هذا العمل بالنسبة لك.

ولقد فعلت ذلك عدة طرق في الماضي. عادة، لقد كان على قائمة من المتغيرات المعروفة وقيمهم، ولقد فعلت الاستعاضة عن تلك القائمة:

for var in PATH VARIABLE USERNAME
do
    echo 's%${'"$var"'}%'$(eval echo "\$$var")'%g'
done > sed.script

cat test | sed -f sed.script > outputfile

إذا كنت تريد تعيين المتغيرات بشكل تعسفي، فإنك تحتاج إما للتعامل مع البيئة كلها (بدلا من قائمة ثابتة من أسماء المتغيرات، استخدم الإخراج من env، على نحو ملائم تحريره)، أو استخدام بيرل أو بيثون بدلا من ذلك.

ملاحظة أنه إذا كانت قيمة متغير بيئة تحتوي على مائلة في الإصدار الخاص بك، وكنت واجهت مشاكل في استخدام الخط المائل كفاصل الحقل في الصورة /// التدوين. لقد استخدمت '٪' منذ متغيرات البيئة قليلة نسبيا تستخدم ذلك - ولكن هناك وجدت بعض على بعض الأجهزة التي لا تحتوي على أحرف '٪'، وذلك حلا كاملا هو اصعب. تحتاج أيضا إلى القلق بشأن الخطوط المائلة العكسية في القيمة. ربما لديك لاستخدام شيء من هذا القبيل "$(eval echo "\$$var" | sed 's/[\%]/\\&/g')" للهروب من الخطوط المائلة العكسية والرموز في المئة في قيمة متغير البيئة. التجاعيد النهائي: بعض إصدارات sed لها (أو كان) قدرة محدودة لحجم النصي - كان الإصدارات القديمة من HP-UX حد من حوالي 100. لست متأكدا ما إذا كان هذا لا يزال يمثل مشكلة، ولكنه كان إلى وقت قريب كما قبل 5 سنوات.

والتكيف بسيط التفكير في السيناريو الأصلي على ما يلي:

env |
sed 's/=.*//' |
while read var
do
    echo 's%${'"$var"'}%'$(eval echo "\$$var" | sed 's/[\%]/\\&/g')'%g'
done > sed.script

cat test | sed -f sed.script > outputfile

ومع ذلك، يستخدم أفضل حل لحقيقة أن لديك بالفعل القيم في الإخراج من env، حتى نتمكن من إرسال:

env |
sed 's/[\%]/\\&/g;s/\([^=]*\)=\(.*\)/s%${\1}%\2%/' > sed.script
cat test | sed -f sed.script > outputfile

وهذا هو تماما أكثر أمانا لأن قذيفة لم يقيم أي شيء لا ينبغي تقييمها - عليك أن تكون حذرا جدا مع الأحرف الخاصة قذيفة في قيم المتغيرات. هذا الإصدار فقط ربما يمكن أن تصل إلى أي مشكلة إذا تم المشوهة بعض الانتاج من env، على ما أعتقد.

وحذار - كتابة النصوص sed مع sed هو الاحتلال مقصور على فئة معينة، ولكن ذلك يدل على قوة وسائل جيدة

وجميع هذه الأمثلة هي مهملة في عدم تنظيف الملفات المؤقتة (ق).

نصائح أخرى

وربما يمكنك الحصول عليه دون استخدام ااا:

$ echo $VARIABLE
something
$ cat test
I'd like to expand this: ${VARIABLE}
$ eval "echo \"`cat test`\"" > outputfile
$ cat outputfile
I'd like to expand this: something

واسمحوا قذيفة متغير الاستيفاء للقيام بهذا العمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top