بهکارگیری عبارات منظم

تا بدینجا درباره عبارات منظم بسیار صحبت شد و مثالهای تمرینی زیادی را اجرا نمودیم. اکنون با استفاده از فرمانهایی که آموخنیم، قصد داریم چند مثال کاربردی را انجام دهیم.
اعتبارسنجی یک لیست تلفن با grep
در مثال درس قبل، شماره تلفنی را برای فرمت مناسب بررسی کردیم. یک سناریوی واقعیتر، بررسی کردن لیستی از شمارههای تلفن است. در ادامه یک لیست ایجاد میکنیم. این کار را با جادوی خط فرمان انجام میدهیم. در اینجا از فرمانهایی استفاده میکنیم که هنوز آنها را توضیح ندادهایم و فقط از آنها استفاده میکنیم و در درسهای بعدی به شرح آنها خواهیم پرداخت:
1 2 |
[me@linuxbox ~]$ for i in {1..10}; do echo "(${RANDOM:0:3}) ${RANDOM:0:3}-$ {RANDOM:0:4}" >> phonelist.txt; done |
این فرمان، فایلی را با نام phonelist.txt ایجاد میکند که حاوی ۱۰ شماره تلفن است. هر زمان که این فرمان تکرار شود، ۱۰ شماره دیگر به لیست اضافه میشود. همچنین میتوانیم مقدار ۱۰ را تغییر دهیم تا تعداد کمتر یا بیشتری شماره ایجاد کنیم.
مثال زیر گویای این مطلب است:
1 2 3 4 5 6 7 8 9 10 11 |
[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 بههمراه یک عبارت منظم استفاده میکنیم تا هر نام مسری که حاوی کاراکتری از اعضای زیر نیست را پیدا کنیم:
1 |
[-_./0-9a-zA-Z] |
چنین جستجویی نامهای مسیر را که حاوی فضاهای نهفته و کاراکترهای محتمل دیگری است را آشکار میسازد:
1 |
[me@linuxbox ~]$ find . -regex '.*[^-_./0-9a-zA-Z].*' |
برای اجرای یک مطابقت دقیق یک نام مسیر (بهصورت کامل)، از .* در پایان هر عبارت استفاده کردیم تا هیچ یا چند نمونه از هر کاراکتری را تطبیق دهد. در میان عبارت از یک عبارت براکتی نفی شده حاوی مجموعهای از کاراکترهای نام مسیر قابل قبول استفاده میکنیم.
جستجو برای فایلها با استفاده از locate
فرمان locate هر دو نوع عبارات منظم پایه (گزینه –regexp) و توسعهیافته (گزینه –regex) را پشتیبانی میکند. با استفاده از آن میتوانیم بسیاری از عملیاتی که قبلا بر روی فایلهای dirlist انجام میدادیم را انجام دهیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[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 استفاده میکنیم:
1 |
[me@linuxbox ~]$ less phonelist.txt |
سپس عبارت اعتبارسنجی را جستجو میکنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
(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 میکند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
(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 عبارت منظم پایه را پشتیبانی کرده، در نتیجه عبارت جستجو ما به این شکل میباشد:
1 |
/([0-9]\{3\}) [0-9]\{3\}-[0-9]\{4\} |
مشاهده میشود که عبارت تقریبا همان است؛ هرچند که بسیاری از کاراکترهایی که در عبارات توسعهیافته متاکاراکتر در نظر گرفته میشدند در عبارات پایه لیترال در نظر گرفته میشوند. آنها فقط زمانی بهعنوان متاکاراکتر عمل میکنند که بهوسیله بکاسلش نادیده گرفته شوند. بسته به پیکربندی ویژه vim بر روی سیستم ما، موارد تطبیق داده شده، highlight میشوند. اگر این اتفاق رخ نداد، حالت فرمان:hlsearch را بهمنظور highlight کردن جستجو، امتحان کنید.
منبع: لینوکسسیزن نوشته فرشید نوتاش حقیقت