وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

روش استفاده از متغیرهای محیطی در دستور Sed

0 2
زمان لازم برای مطالعه: 4 دقیقه


متغیر محیطی یک مقدار با نام پویا است. متغیرهای محیطی معمولاً به a صادر می شوند terminal با استفاده از دستور زیر

export $SOMEVARIABLE= ارزش

فایل ها پس از منبع در همه پایانه ها در دسترس هستند. برای این منظور متغیرهای محیطی در داخل ذخیره می شوند bash فایل ها.

فرض کنید کاربر باید به کمک دستور sed از متغیرهای محیطی استفاده کند یا تغییر دهد. در این صورت، کاربران نمی توانند از دستوری که در بالا ذکر شد برای این کار استفاده کنند. توابع و روش های مختلفی باید برای دستور sed استفاده شود. در این مقاله چند روش از این دست را مشاهده می کنیم که در ادامه می آید.

در لینوکس command-linesed یک ابزار پردازش قوی است. با استفاده از تک لاینرهای فشرده sed، کاربران اغلب جایگزین متن را انجام می دهند که بسیار راحت است. وقتی کاربران sed را با متغیرهای پوسته جایگزین می کنند، معایبی نیز دارد.

روش استفاده از متغیرهای محیطی در دستور Sed

بیایید یک مثال داشته باشیم، در اینجا ما یک فایل به نام test.txt داریم.

گربه 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 برای انجام ویرایش در محل.

پیشنهاد می‌کنیم بخوانید:  چگونه یک رشته را در یک فایل در Bash جایگزین کنیم

اکنون اسکریپت خود را بررسی و اجرا می کنیم.

دلار/راه حل.ش
$ گربه 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 شامل چه چیزی است.

$ اکو $JAVA_HOME
/usr/lib/jvm/پیش فرض

می‌توانیم ببینیم که این متغیرهای پوسته در داخل گیومه‌های دوگانه گسترش یافته‌اند. بنابراین دومین فرمان sed ما بعد از بسط متغیر می آید.

sed -من -r “s/^(JAVA_HOME =).*/\1 /usr/lib/jvm/default/” test.txt

اسلش های (/) در مقدار متغیر با دستور ‘s’ (s/pattern/replacement/) تداخل دارد، به همین دلیل دستور sed بالا کار نمی کند. به این ترتیب می توانیم کاراکترهای دیگری را به عنوان جداکننده دستور ‘s’ انتخاب کنیم.

کاربران می توانند فرمان دوم sed را کمی تغییر دهند تا با استفاده از ‘#’ به عنوان جداکننده دستور s حل شود.

sed -من -r “s#^(JAVA_HOME =).*#\1 $JAVA_HOME#” test.txt

حال اسکریپت بالا را تست می کنیم.

دلار/راه حل.ش
$ گربه test.txt
CURRENT_TIME = چهارشنبه ژانویه 27 10:36:57 PM CET 2021

پیشنهاد می‌کنیم بخوانید:  پشت نام Basename – Bash

JAVA_HOME = /usr/lib/jvm/پیش فرض

راه حل 2

Solution.sh در اکثر موارد کار می کند. همچنین، می بینیم که “#” در نام فایل ها یک کاراکتر معتبر است روی اکثر سیستم های فایل * nix. اگر اسکریپت خود را در JAVA_HOME اجرا کنیم روی سیستمی که روی /opt/#jvm# تنظیم شده است، اسکریپت کاربر دوباره از کار می افتد. ما کارهای زیر را انجام خواهیم داد تا اسکریپت ما در همه موارد کار کند

  1. اگر کاربر برای خوانایی بهتر ‘#’ را به عنوان جداکننده انتخاب کند، باید یک جداکننده برای دستور sed انتخاب کند.
  2. ما باید از تمام کاراکترهای جداکننده که در محتویات متغیر هستند فرار کنیم.
  3. در نهایت، مواد باقی مانده را در دستور sed جمع آوری کنید.

کاربران می توانند استفاده کنند bash جایگزینی برای فرار از جداکننده. به عنوان مثال، کاربر می تواند از همه کاراکترهای ‘#’ در متغیر $VAR فرار کند.

$ 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 آزمایش می کنیم تا ببینیم آیا مطابق انتظار کار می کند یا خیر.

$ JAVA_HOME=/انتخاب کردن/#/:/@/-/_/$/jvm ./solution.sh

$ گربه test.txt
CURRENT_TIME = پنجشنبه ژانویه 28 11:23:07 صبح CET 2021

JAVA_HOME = /انتخاب کردن/#/:/@/-/_/$/jvm

نتیجه می گیریم که اسکریپت ما کار می کند حتی اگر در متغیر JAVA_HOME خود کاراکترهای خاص زیادی داریم.

نتیجه

در این مقاله روش استفاده از متغیرهای محیطی با دستور sed را دیدیم. آنها همچنین اشتباهات زیادی را مرتکب می شوند که در این مقاله به آنها و رفع آنها نیز اشاره کرده ایم. امیدواریم از این مقاله دانش کامل مورد نیاز خود را بدست آورید.

برای نگارش بخشهایی از این متن ممکن است از ترجمه ماشینی یا هوش مصنوعی GPT استفاده شده باشد
لطفا در صورت وجود مشکل در متن یا مفهوم نبودن توضیحات، از طریق دکمه گزارش نوشتار یا درج نظر روی این مطلب ما را از جزییات مشکل مشاهده شده مطلع کنید تا به آن رسیدگی کنیم

زمان انتشار: 1402-12-30 12:54:05

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید