در ادامه آموزش لینوکس Lpic 1 می خواهیم جستجوی فایلهای متنی با استفاده از رگولار اکسپرشنها (regular expressions) ها را آموزش دهیم پس در ادامه با نکست ادمین همراه باشید.
رگولار اکسپرشنها (regular expressions) بسیار بحث کاربردی هست ولی یکمقدار پیچیدگی دارد، سعی می کنیم تا جای ممکن ساده و مفید توضیح دهیم.
عبارت باقاعده، که تحت عنوان regex یا regexp یا regular expression نیز نامیده میشود در علوم رایانه، به معنی تطبیق رشته در متن است، که از قبیل نویسههای خاص، کلمات و الگوهایی از نویسهها میباشد. یک عبارت باقاعده با زبان معمولی نوشته میشود که میتواند توسط یک پردازشگر عبارت باقاعده، یا یک برنامه که به عنوان تولیدکنندهٔ مترجم یا بررسیکنندهٔ متن و تشخیص قسمتهایی از آن به وسیلهٔ مشخصات استفاده شود.
این نمونهها میتوانید قابلیتها محدودی که عبارت با قاعده میتواند انجام دهد را نشان دهد:
- دنبالهای از نویسههای «car» در هر متن، از قبیل «car”, “cartoon» یا «bicarbonate»
- لغت «car» در زمانی که به صورت جداگانه استفاده شود
- لغت «car» وقتی که قبل از «blue» یا «red» آمده باشد
- یک نویسهٔ «$» که پس از آن یک یا چند رقم بیاید و پس از آن به صورت اختیاری یک ممیز بیاید و پس از ممیز دقیقاً دو رقم اضافه قرار داشته باشد (مانند «$10» یا «$245/99»)
عبارتهای باقاعده میتوانند خیلی پیچیدهتر از این مثالها باشند.
ما قرار بیشتر دستوراتمان را به grep نمایش دهیم. در مثال ساده زیر ما یک لیست ساده به اسم friends داریم که داریم میگم هرچی که p داره بهم نشون بده:
$ grep p friends
payam
pedram
Regex | Will match |
---|---|
a | ali, mina, hamid, jadi |
na | nasim, mina, nananana batman, mona |
تکرار شوندها Repeating در regular expressions
قوانینی که در regular expressions ها به شما کمک می کند
- * به معنی 0 کاراکتر یا بیشتر می باشد
- + به معنی 1 کاراکتر یا بیشتر می باشد
- ؟ به معنی هیچی یا یک کاراکتر می باشد
- ترکیب {n,m} حداقل و حداکثر، برای مثال a{2,4} z به معنی این که اگر یک a باشد که حداقل دوتا a پشت هم بود ولی بیشتر از 4 تا a نباشد. بین دو تا چهار a را نمایش می دهد.
Alternation (|) در regular expressions
دستور egrep برای استفاده از Extended Regular Expressions ها استفاده می شود. برای نمونه با دستور زیر به داخل فایل friends دنبال هر چیزی که یا a یا b یا c دارد می گردیم.
$ egrep "(a|b|c)" friends
Ranges در regular expressions
همچین می توانیم از دستورات از پیش نوشته شده استفاده کنیم:
Range | Meaning |
---|---|
[:alnum:] | Alphanumeric characters به معنی همه اعداد و حروف |
[:blank:] | Space و tab ها |
[:digit:] | تمام اعداد از 0 تا 9 |
[:upper:] and [:lower:] | Upper به معنی تمام حروف بزرگ و lower به معنی همه حروف کوچک |
^ (negation) | کاراکتر ^ به اول خط اشاره می کند یعنی a^ به معنی هر چیزی که اول با a شروع می شود |
$ | یعنی اخر خط برای مثال $a به معنی هرچیزی که اخر a دارد. |
. | هر جا . قرار بگیره یعنی هر چیزی |
برای مثال دستور زیر را نگاه کنید:
$ egrep "^[a-h].*a$ friends
در خط بالا مواردی را نمایش می دهد که اولش با a تا h شروع می شود و بعدش هر کاراکتری بود (.) و هر چندتا (*) و با a تمام می شود ($)
چند مثال:
^a.*
هرچیزی که با a شروع می شود.^a.*b$
هر چیزی که با a شروع می شود و یا b تمام می شود.^a.*\d+.*b$
هر چیزی که با a شروع می شود و چنتا عدد وسطش دارد و با b تمام می شود.^(l|b)oo
هر چیزی که با l یا b شروع می شود و بعدش oo دارد.[f-h]|[A-K]$
اخرین کاراکتر باید با f تا h یا A تا K تمام شود.
نکته: egrep معادل دستور زیر است:
$ grep -E
چنتا از سوئیچ های دستور grep و egrep:
switch | meaning |
---|---|
-c | تعداد را نمایش می دهد. |
-v | سرچ را برعکس کرده و به جای این که چیزی که نوشتید را نمایش دهد چیزی را نمایش میدهد که مورد شما داخل آن نباشد. |
-n | شماره لاین (خط) را نمایش میدهد. |
-l | اسم فایل هایی را می دهد که ما نوشته ایم. |
-i | غیر حساس به بزرگ و کوچک، هم حروف بزرگ را برسی می کند و هم کوچک را |
$ grep p *
friends:payam
friends:pedram
what_I_have.txt:laptop 2
what_I_have.txt:pillow 5
what_I_have.txt:apple 2
$ grep p * -n
friends:12:payam
friends:15:pedram
what_I_have.txt:2:laptop 2
what_I_have.txt:3:pillow 5
what_I_have.txt:4:apple 2
$ grep p * -l
friends
what_I_have.txt
$ grep p * -c
friends:2
what_I_have.txt:3
Fixed grep
اگر شما داخل فایل خود اسمس داشته باشید که یک کاراکتر خاص داخل آن باشد مثل $ali برای این که بتوانید آنرا پیدا کنید نیاز به سوئیچ F یا دستور fgrep دارید:
$ grep -F "i$" friends
و یا
$ fgrep "i$" friends
دستور sed در لینوکس
ما قبلا در اینجا درباره دستور sed در لینوکس صحبت کرده بودیم ولی در اینجا می توانید با سوئیچ r امکان regex را به این دستور اضافه کنید:
$ sed -r "s/^(a|b)/STARTS WITH A OR B/" friends
STARTS WITH A OR Bmir
mina
jadi
STARTS WITH A OR Bita
STARTS WITH A OR Bli
hassan
$ sed -rn "/^(a|b)/p" friends
amir
bita
ali