بهکارگیری عبارات منظم
تا بدینجا درباره عبارات منظم بسیار صحبت شد و مثالهای تمرینی زیادی را اجرا نمودیم. اکنون با استفاده از فرمانهایی که آموخنیم، قصد داریم چند مثال کاربردی را انجام دهیم.
اعتبارسنجی یک لیست تلفن با grep
در مثال درس قبل، شماره تلفنی را برای فرمت مناسب بررسی کردیم. یک سناریوی واقعیتر، بررسی کردن لیستی از شمارههای تلفن است. در ادامه یک لیست ایجاد میکنیم. این کار را با جادوی خط فرمان انجام میدهیم. در اینجا از فرمانهایی استفاده میکنیم که هنوز آنها را توضیح ندادهایم و فقط از آنها استفاده میکنیم و در درسهای بعدی به شرح آنها خواهیم پرداخت:
[me@linuxbox ~]$ for i in {1..10}; do echo "(${RANDOM:0:3}) ${RANDOM:0:3}-$
{RANDOM:0:4}" >> phonelist.txt; done
این فرمان، فایلی را با نام phonelist.txt ایجاد میکند که حاوی 10 شماره تلفن است. هر زمان که این فرمان تکرار شود، 10 شماره دیگر به لیست اضافه میشود. همچنین میتوانیم مقدار 10 را تغییر دهیم تا تعداد کمتر یا بیشتری شماره ایجاد کنیم.
مثال زیر گویای این مطلب است:
[me@linuxbox ~]$ cat phonelist.txt (232) 298-2265 (624) 381-1078 (540) 126-1980 (874) 163-2885 (286) 254-2860 (292) 108-518 (129) 44-1379 (458) 273-1642 (686) 299-8268 (198) 307-2440
یافتن نامهای بدترکیب فایل با کمک فرمان find
فرمان find از یک تست خاص، بر مبنای عبارات منظم پشتیبانی میکند. بههنگام استفاده از find بهجای grep در عبارات منظم، موضوعی مهم را بایستی در نظر بگیرید.
اینکه grep خطی را که حاوی با عبارت منظم مورد مطابقت داده شده را چاپ میکند؛ اما در find بایستی نام مسیر، دقیقا با عبارت منظم مطابقت پیدا کند.
در مثال زیر از find بههمراه یک عبارت منظم استفاده میکنیم تا هر نام مسری که حاوی کاراکتری از اعضای زیر نیست را پیدا کنیم:
[-_./0-9a-zA-Z]
چنین جستجویی نامهای مسیر را که حاوی فضاهای نهفته و کاراکترهای محتمل دیگری است را آشکار میسازد:
[me@linuxbox ~]$ find . -regex '.*[^-_./0-9a-zA-Z].*'
برای اجرای یک مطابقت دقیق یک نام مسیر (بهصورت کامل)، از .* در پایان هر عبارت استفاده کردیم تا هیچ یا چند نمونه از هر کاراکتری را تطبیق دهد. در میان عبارت از یک عبارت براکتی نفی شده حاوی مجموعهای از کاراکترهای نام مسیر قابل قبول استفاده میکنیم.
جستجو برای فایلها با استفاده از locate
فرمان locate هر دو نوع عبارات منظم پایه (گزینه –regexp) و توسعهیافته (گزینه –regex) را پشتیبانی میکند. با استفاده از آن میتوانیم بسیاری از عملیاتی که قبلا بر روی فایلهای dirlist انجام میدادیم را انجام دهیم:
[me@linuxbox ~]$ locate --regex 'bin/(bz|gz|zip)' /bin/bzcat /bin/bzcmp /bin/bzdiff /bin/bzegrep /bin/bzexe /bin/bzfgrep /bin/bzgrep /bin/bzip2 /bin/bzip2recover /bin/bzless /bin/bzmore /bin/gzexe /bin/gzip /usr/bin/zip /usr/bin/zipcloak /usr/bin/zipgrep /usr/bin/zipinfo /usr/bin/zipnote /usr/bin/zipsplit
با استفاده از تناوب، جستجویی برای نامهای مسیری که حاوی bin/bz، bin/gz و /bin/zip میباشند را انجام میدهیم.
جستجو متن با less و vim
فرمان less و vim روش جستجوی یکسانی را برای متن بهاشتراک میگذارند. فشردن کلید / بههمراه یک عبارت منظم، جستجویی را انجام خواهد داد. ما از less بهمنظور نمایش فایل phonelist.txt استفاده میکنیم:
[me@linuxbox ~]$ less phonelist.txt
سپس عبارت اعتبارسنجی را جستجو میکنیم:
(232) 298-2265
(624) 381-1078
(540) 126-1980
(874) 163-2885
(286) 254-2860
(292) 108-518
(129) 44-1379
(458) 273-1642
(686) 299-8268
(198) 307-2440
~
~
~
/^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$
ملاحظه میکنید که less موارد مطابقت شده را highlight میکند.
(232) 298-2265 (624) 381-1078 (540) 126-1980 (874) 163-2885 (286) 254-2860 (292) 108-518 (129) 44-1379 (458) 273-1642 (686) 299-8268 (198) 307-2440 ~ ~ ~ (END)
در مقابل آن vim عبارت منظم پایه را پشتیبانی کرده، در نتیجه عبارت جستجو ما به این شکل میباشد:
/([0-9]\{3\}) [0-9]\{3\}-[0-9]\{4\}
مشاهده میشود که عبارت تقریبا همان است؛ هرچند که بسیاری از کاراکترهایی که در عبارات توسعهیافته متاکاراکتر در نظر گرفته میشدند در عبارات پایه لیترال در نظر گرفته میشوند. آنها فقط زمانی بهعنوان متاکاراکتر عمل میکنند که بهوسیله بکاسلش نادیده گرفته شوند. بسته به پیکربندی ویژه vim بر روی سیستم ما، موارد تطبیق داده شده، highlight میشوند. اگر این اتفاق رخ نداد، حالت فرمان:hlsearch را بهمنظور highlight کردن جستجو، امتحان کنید.
منبع: لینوکسسیزن نوشته فرشید نوتاش حقیقتدرباره فرشید نوتاش حقیقت
همیشه نیازمند یک منبع آموزشی فارسی در حوزه نرمافزارهای آزاد/ متنباز و سیستمعامل گنو/لینوکس بودم. از این رو این رسالت رو برای خودم تعریف کردم تا رسانه «محتوای باز» رو بوجود بیارم.
نوشتههای بیشتر از فرشید نوتاش حقیقتاین سایت از اکیسمت برای کاهش جفنگ استفاده میکند. درباره چگونگی پردازش دادههای دیدگاه خود بیشتر بدانید.
دیدگاهتان را بنویسید