از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
روش استفاده از متغیرهای محیطی در دستور Sed
سرفصلهای مطلب
فایل ها پس از منبع در همه پایانه ها در دسترس هستند. برای این منظور متغیرهای محیطی در داخل ذخیره می شوند bash فایل ها.
فرض کنید کاربر باید به کمک دستور sed از متغیرهای محیطی استفاده کند یا تغییر دهد. در این صورت، کاربران نمی توانند از دستوری که در بالا ذکر شد برای این کار استفاده کنند. توابع و روش های مختلفی باید برای دستور sed استفاده شود. در این مقاله چند روش از این دست را مشاهده می کنیم که در ادامه می آید.
در لینوکس command-linesed یک ابزار پردازش قوی است. با استفاده از تک لاینرهای فشرده sed، کاربران اغلب جایگزین متن را انجام می دهند که بسیار راحت است. وقتی کاربران sed را با متغیرهای پوسته جایگزین می کنند، معایبی نیز دارد.
روش استفاده از متغیرهای محیطی در دستور Sed
بیایید یک مثال داشته باشیم، در اینجا ما یک فایل به نام test.txt داریم.
CURRENT_TIME = # پر کنید
جاری تاریخ و زمان
JAVA_HOME = # پر کنید
مسیر JAVA_HOME
ما یک اسکریپت پوسته می نویسیم تا مسیر JAVA_HOME و زمان فعلی را در سیستم فعلی داده شده در بالا پر کند. این process آسان است، اما برخی از مشکلات در آن وجود دارد که امکان پذیر است. در اینجا با استفاده از یک اسکریپت می نویسیم GNU sed
همانطور که در بالا ذکر کردیم، در اینجا مسیر JAVA_HOME و زمان فعلی را جایگزین می کنیم. برای این، ابتدا زمان فعلی را در مکان های مناسب در اینجا پر می کنیم. می توانیم از دستور date برای دریافت زمان جاری استفاده کنیم.
#!/bin/sh
MY_DATE=$(تاریخ)
sed -من -r ‘s/^(CURRENT_TIME =).*/\1 $MY_DATE/’ test.txt
درک اسکریپت نوشته شده در بالا چندان دشوار نیست. ابتدا با جایگزین کردن دستور در متغیر MY_DATE، زمان و تاریخ فعلی را دریافت کرده و آن را ذخیره کنید.
پس از دریافت داده ها با استفاده از جایگزینی sed، کاربر آن را در فایل پر می کند. ما از گزینه -i استفاده کرده ایم GNU دستور sed برای انجام ویرایش در محل.
اکنون اسکریپت خود را بررسی و اجرا می کنیم.
$ گربه test.txt
CURRENT_TIME = $MY_DATE
JAVA_HOME = # مسیر JAVA_HOME را پر کنید
در خروجی می بینیم که خط “CURRENT_TIME =” جایگزین شده است. با این حال، “$MY_DATE” تحت اللفظی به جای زمان و تاریخ فعلی پر شده است.
دلیل اینکه متغیرهای پوسته در داخل quotes منفرد گسترش نمییابند این است که ما از تک نقل قولها تحت دستور sed استفاده میکنیم.
از علامتهای نقل قول دوگانه در دستور sed استفاده میشود تا امکان گسترش سریع متغیر پوسته را فراهم کند.
#!/bin/sh
MY_DATE=$(تاریخ)
sed -من -r “s/^(CURRENT_TIME =).*/\1 $MY_DATE/” test.txt
حالا دوباره اسکریپت solution.sh را تست می کنیم.
$ گربه test.txt
CURRENT_TIME = چهارشنبه ژانویه 27 10:02:05 بعد از ظهر CET 2021
JAVA_HOME = # مسیر JAVA_HOME را پر کنید
پس از پر کردن ساعت و تاریخ در مکان های مناسب، مسیر JAVA_HOME پر می شود.
با افزودن یک دستور sed دیگر به اسکریپت Solution.sh می بینیم که از کدام جداکننده استفاده کنیم.
…
sed -من -r “s/^(CURRENT_TIME =).*/\1 $MY_DATE/” test.txt
sed -من -r “s/^(JAVA_HOME =).*/\1 $JAVA_HOME/” test.txt
بررسی اسکریپت بالا
sed: -e اصطلاح شماره 1، کاراکتر 24: گزینه ناشناخته به “s”
می بینیم که دستور جدید sed که اضافه شده کار نمی کند. اگر برای بار دوم آن را تست کنیم، می بینیم که فقط متغیر آن متفاوت است، اما کار کردن مانند دستور sed است. برای حل این مشکل، باید اقدامات زیر را انجام دهیم:
جداکننده در متغیر وجود ندارد
برای دانستن این موضوع، کاربران ابتدا باید بفهمند که متغیر محیطی $JAVA_HOME شامل چه چیزی است.
/usr/lib/jvm/پیش فرض
میتوانیم ببینیم که این متغیرهای پوسته در داخل گیومههای دوگانه گسترش یافتهاند. بنابراین دومین فرمان sed ما بعد از بسط متغیر می آید.
اسلش های (/) در مقدار متغیر با دستور ‘s’ (s/pattern/replacement/) تداخل دارد، به همین دلیل دستور sed بالا کار نمی کند. به این ترتیب می توانیم کاراکترهای دیگری را به عنوان جداکننده دستور ‘s’ انتخاب کنیم.
کاربران می توانند فرمان دوم sed را کمی تغییر دهند تا با استفاده از ‘#’ به عنوان جداکننده دستور s حل شود.
حال اسکریپت بالا را تست می کنیم.
$ گربه test.txt
CURRENT_TIME = چهارشنبه ژانویه 27 10:36:57 PM CET 2021
JAVA_HOME = /usr/lib/jvm/پیش فرض
راه حل 2
Solution.sh در اکثر موارد کار می کند. همچنین، می بینیم که “#” در نام فایل ها یک کاراکتر معتبر است روی اکثر سیستم های فایل * nix. اگر اسکریپت خود را در JAVA_HOME اجرا کنیم روی سیستمی که روی /opt/#jvm# تنظیم شده است، اسکریپت کاربر دوباره از کار می افتد. ما کارهای زیر را انجام خواهیم داد تا اسکریپت ما در همه موارد کار کند
- اگر کاربر برای خوانایی بهتر ‘#’ را به عنوان جداکننده انتخاب کند، باید یک جداکننده برای دستور sed انتخاب کند.
- ما باید از تمام کاراکترهای جداکننده که در محتویات متغیر هستند فرار کنیم.
- در نهایت، مواد باقی مانده را در دستور sed جمع آوری کنید.
کاربران می توانند استفاده کنند bash جایگزینی برای فرار از جداکننده. به عنوان مثال، کاربر می تواند از همه کاراکترهای ‘#’ در متغیر $VAR فرار کند.
$ اکو “${VAR//#/\\#}“
فو\#بار\#بله
اکنون اسکریپت خود را در اینجا اعمال می کنیم.
#!/bin/sh
MY_DATE=$(تاریخ)
sed -من -r “s/^(CURRENT_TIME =).*/\1 $MY_DATE/” test.txt
sed -من -r “s#^(JAVA_HOME =).*#\1 ${JAVA_HOME//#/\\#}#” test.txt
ما با اجرای اسکریپت خود با متغیر جعلی JAVA_HOME آزمایش می کنیم تا ببینیم آیا مطابق انتظار کار می کند یا خیر.
$ گربه test.txt
CURRENT_TIME = پنجشنبه ژانویه 28 11:23:07 صبح CET 2021
JAVA_HOME = /انتخاب کردن/#/:/@/-/_/$/jvm
نتیجه می گیریم که اسکریپت ما کار می کند حتی اگر در متغیر JAVA_HOME خود کاراکترهای خاص زیادی داریم.
نتیجه
در این مقاله روش استفاده از متغیرهای محیطی با دستور sed را دیدیم. آنها همچنین اشتباهات زیادی را مرتکب می شوند که در این مقاله به آنها و رفع آنها نیز اشاره کرده ایم. امیدواریم از این مقاله دانش کامل مورد نیاز خود را بدست آورید.
لطفا در صورت وجود مشکل در متن یا مفهوم نبودن توضیحات، از طریق دکمه گزارش نوشتار یا درج نظر روی این مطلب ما را از جزییات مشکل مشاهده شده مطلع کنید تا به آن رسیدگی کنیم
زمان انتشار: 1402-12-30 12:54:05