LPIC-1Linux

آموزش Lpic 1 لینوکس: جستجوی فایل‌های متنی با استفاده از regular expressions

regular expressions

در ادامه آموزش لینوکس Lpic 1 می خواهیم جستجوی فایل‌های متنی با استفاده از رگولار اکسپرشن‌ها (regular expressions) ها را آموزش دهیم پس در ادامه با نکست ادمین همراه باشید.

رگولار اکسپرشن‌ها (regular expressions) بسیار بحث کاربردی هست ولی یکمقدار پیچیدگی دارد، سعی می کنیم تا جای ممکن ساده و مفید توضیح دهیم.

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

fgrep
fgrep

اگر شما داخل فایل خود اسمس داشته باشید که یک کاراکتر خاص داخل آن باشد مثل $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
Shares:

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *