ეგრეპ რეგულარული გამონათქვამების მაგალითები. grep-ის გამოყენების ხუთი მაგალითი

დღევანდელ სტატიაში მინდა შევეხო ისეთ უზარმაზარ თემას, როგორიცაა რეგულარული გამონათქვამები... ვფიქრობ, ყველამ იცის, რომ რეგექსების თემა (როგორც რეგულარულ გამონათქვამებს ჟარგონში უწოდებენ) უზარმაზარია ერთი პოსტის მოცულობაში.

დასაწყისისთვის, არსებობს რეგულარული გამონათქვამების რამდენიმე არომატი:

1. ტრადიციული რეგულარული გამონათქვამები(ისინი ასევე არის ძირითადი, ძირითადი და ძირითადი რეგულარული გამონათქვამები(BRE))

  • ამ გამონათქვამების სინტაქსი განისაზღვრება, როგორც მოძველებული, მაგრამ მაინც ფართოდ არის გავრცელებული და გამოიყენება UNIX-ის მრავალი კომუნალური პროგრამის მიერ.
  • ძირითადი რეგულარული გამონათქვამები მოიცავს შემდეგ მეტანიშნებს (იხილეთ მათი მნიშვნელობა ქვემოთ):
    • \ (\) - ორიგინალი ()-სთვის (გაფართოებულში)
    • \ (\) - ორიგინალი ()-სთვის (გაფართოებულში)
    • \, სად - ნომერი 1-დან 9-მდე
  • ამ მეტაგმირების გამოყენების მახასიათებლები:
    • ვარსკვლავი უნდა მიჰყვეს გამონათქვამს, რომელიც ემთხვევა ერთ სიმბოლოს. მაგალითი: *.
    • გამოხატულება \( ბლოკი\) * უნდა ჩაითვალოს ბათილად. ზოგიერთ შემთხვევაში, ის ემთხვევა სტრიქონის ნულოვან ან მეტ გამეორებას. ბლოკი... სხვებში ის ემთხვევა სტრიქონს ბლოკი* .
    • პერსონაჟების კლასში, სიმბოლოების განსაკუთრებული მნიშვნელობები ზოგადად იგნორირებულია. განსაკუთრებული შემთხვევები:
    • ნაკრებისთვის ^ სიმბოლოს დასამატებლად ის არ უნდა განთავსდეს იქ პირველ რიგში.
    • სიმბოლოს დასამატებლად - კომპლექტში, ის უნდა განთავსდეს იქ ჯერ ან ბოლოს. Მაგალითად:
      • DNS სახელის ნიმუში, რომელიც შეიძლება შეიცავდეს ასოებს, რიცხვებს, მინუს და გამყოფ პერიოდს: [-0-9a-zA-Z.];
      • ნებისმიერი სიმბოლო მინუს და ციფრის გარდა: [^ -0-9].
    • ნაკრებში [ან] სიმბოლოს დასამატებლად, ის ჯერ იქ უნდა განთავსდეს. Მაგალითად:
      • შესატყვისები], [, a, ან b.

2. გაფართოებული რეგულარული გამონათქვამები(ისინი არიან გაფართოებული რეგულარული გამონათქვამები(ERE))

  • ამ გამონათქვამების სინტაქსი იგივეა, რაც ძირითადი გამონათქვამებისთვის, გარდა:
    • ამოღებულია უკუღმა ხაზების გამოყენება () და () მეტაგმირებისთვის.
    • უკუღმა ხაზგასმა მეტახასიათის წინ აუქმებს მის განსაკუთრებულ მნიშვნელობას.
    • თეორიულად უარყოფილია არარეგულარულიმშენებლობა \ .
    • დაამატა მეტაგმირები +,? , | ...

3. Perl თავსებადი რეგულარული გამონათქვამები(ისინი არიან Perl-თან თავსებადი რეგულარული გამონათქვამები(PCRE))

  • აქვს უფრო მდიდარი და ამავე დროს პროგნოზირებადი სინტაქსი ვიდრე თუნდაც POSIX ERE, ამიტომ მას ხშირად იყენებენ აპლიკაციები.

რეგულარული გამონათქვამები შედგებაშაბლონები, უფრო სწორად დააყენეთ ნიმუშიძებნა. შაბლონი შედგებადან წესებიძიებები, რომლებიც შედგება პერსონაჟებიდა მეტაპერსონაჟები.

ძებნის წესებიგანისაზღვრება შემდეგით ოპერაციები:

აღრიცხვა |

ვერტიკალური ზოლი (|)გამოყოფს მოქმედ ვარიანტებს, შეგვიძლია ვთქვათ - ლოგიკური ან. მაგალითად, "ნაცრისფერი | ნაცრისფერი" ემთხვევა ნაცრისფერიან ნაცრისფერი.

დაჯგუფება ან გაერთიანება ()

მრგვალი ფრჩხილებიგამოიყენება ოპერატორების ფარგლების და პრიორიტეტის დასადგენად. მაგალითად, "ნაცრისფერი | ნაცრისფერი" და "gr (a | e) y" სხვადასხვა ნიმუშებია, მაგრამ ორივე აღწერს კომპლექტს, რომელიც შეიცავს ნაცრისფერიდა ნაცრისფერი.

რაოდენობრივი ()? * +

კვანტიფიკატორიმას შემდეგ, რაც პერსონაჟი ან ჯგუფი განსაზღვრავს რამდენჯერ ადრეგამოხატვა შეიძლება მოხდეს.

ზოგადი გამოხატულება, გამეორება შეიძლება იყოს m-დან n-მდე ჩათვლით.

ზოგადი გამოხატულება, მ ან მეტი გამეორება.

ზოგადი გამოხატულება, არაუმეტეს n გამეორებისა.

გლუვიn გამეორება.

Კითხვის ნიშანინიშნავს 0 ან 1ჯერ, იგივე რაც {0,1} ... მაგალითად, "colou? R" ემთხვევა და ფერი, და ფერი.

ვარსკვლავინიშნავს 0, 1 ან ნებისმიერი ნომერიერთხელ ( {0,} ). მაგალითად, "go * gle" ემთხვევა ღელე, სათვალე, გუგლიდა ა.შ.

Პლუსინიშნავს მინიმუმ 1ერთხელ ( {1,} ). მაგალითად, "go + gle" ემთხვევა სათვალე, გუგლიდა ა.შ. (მაგრამ არა ღელე).

ამ რეგულარული გამონათქვამების სპეციფიკური სინტაქსი დამოკიდებულია იმპლემენტაციაზე. (ანუ ში ძირითადი რეგულარული გამონათქვამებისიმბოლოები (და)- უკუღმა გაიქცა)

მეტაპერსონაჟებიმარტივი სიტყვებით, ეს არის სიმბოლოები, რომლებიც არ შეესაბამება მათ რეალურ მნიშვნელობას, ანუ სიმბოლოს. (წერტილი) არ არის წერტილი, არამედ რომელიმე პერსონაჟი და ა.შ. გთხოვთ გაეცნოთ მეტახასიათებს და მათ მნიშვნელობებს:

. შეესაბამება ერთინებისმიერი პერსონაჟი
[რაღაც] შეესაბამება ნებისმიერი სინგლიფრჩხილებში ჩასმული პერსონაჟი. ამ შემთხვევაში: "-" სიმბოლო ინტერპრეტირებულია სიტყვასიტყვით მხოლოდ იმ შემთხვევაში, თუ ის მდებარეობს გახსნისთანავე ან დახურვის ფრჩხილამდე: ან [-abc]. წინააღმდეგ შემთხვევაში, ის აღნიშნავს სიმბოლოთა დიაპაზონს. მაგალითად, ემთხვევა "a", "b" ან "c". შეესაბამება ლათინური ანბანის მცირე ასოებს. ეს აღნიშვნები შეიძლება და გაერთიანდეს: შეესაბამება a, b, c, q, r, s, t, u, v, w, x, y, z. სიმბოლოების "[" ან "] შესატყვისად საკმარისია, რომ დახურვის ფრჩხილში იყო პირველი სიმბოლო გახსნის სიმბოლოს შემდეგ: ემთხვევა "]", "[", "a" ან "b". თუ კვადრატულ ფრჩხილებში მნიშვნელობა წინ უსწრებს ^, მაშინ გამოხატვის მნიშვნელობა ემთხვევა. ერთი პერსონაჟიმათ შორის რომლებიც არ არის ფრჩხილებში... მაგალითად, [^ abc] ემთხვევა ნებისმიერ სიმბოლოს, გარდა "a", "b" ან "c". [^ a-z] შეესაბამება ნებისმიერ სიმბოლოს, გარდა ლათინური მცირე ასოების.
^ შეესაბამება ტექსტის დასაწყისს (ან ნებისმიერი სტრიქონის დასაწყისს, თუ ხაზის რეჟიმში).
$ ემთხვევა ტექსტის დასასრულს (ან ნებისმიერი სტრიქონის დასასრულს, თუ ინლაინ რეჟიმში).
\(\) ან () აცხადებს "მონიშნული ქვეგამოთქმა" (ჯგუფური გამოხატულება), რომელიც შეიძლება გამოყენებულ იქნას მოგვიანებით (იხ. შემდეგი ელემენტი: \ ). „მონიშნული ქვეგამოთქმა“ ასევე არის „ბლოკი“. სხვა ოპერატორებისგან განსხვავებით, ამ ოპერატორს (ტრადიციულ სინტაქსში) სჭირდება უკანა ხაზი, გაფართოებულში და Perl-ში \ - არ არის საჭირო.
\ სად - ეს არის რიცხვი 1-დან 9-მდე; შეესაბამება მონიშნული ქვეგამოთქმა (მაგალითად (abcd) \ 0, ანუ abcd სიმბოლოები აღინიშნება ნულით). ეს კონსტრუქცია თეორიულად არის არარეგულარული, ის არ იყო მიღებული გაფართოებული რეგულარული გამოხატვის სინტაქსში.
*
  • ვარსკვლავიმას შემდეგ, რაც გამოთქმა შეესაბამება ერთი სიმბოლოს ნულიან მეტი ასლებიამ (წინა) გამოხატვის. მაგალითად, "*" ემთხვევა ცარიელ სტრიქონს, "x", "y", "zx", "zyx" და ა.შ.
  • \*, სადაც არის ციფრი 1-დან 9-მდე, ემთხვევა ნულს ან მეტ მოვლენას მონიშნული ქვეგამოთქმა. მაგალითად, "\ (a. \) C \ 1 *" ემთხვევა "abcab" და "abcaba", მაგრამ არა "abcac".

"\ (" და "\)"-ში ჩასმული გამოთქმა, რასაც მოჰყვება "*" უნდა ჩაითვალოს არასწორად. ზოგიერთ შემთხვევაში, ის ემთხვევა ფრჩხილებში ჩასმული სტრიქონის ნულოვან ან მეტ შემთხვევას. სხვებში ის ემთხვევა ფრჩხილებში ჩასმული გამოთქმას, "*" სიმბოლოს გათვალისწინებით.

\{x,\} შეესაბამება ამ უკანასკნელს ( მომავალი) ბლოკში, სულ მცირე xდა მეტი არა ერთხელ. მაგალითად, "a \ (3,5 \)" ემთხვევა "aaa", "aaaa" ან "aaaaa". სხვა ოპერატორებისგან განსხვავებით, ამ ოპერატორს (ტრადიციულ სინტაქსში) სჭირდება უკანა ხაზი.
.* ნებისმიერი სიმბოლოს ნებისმიერი რაოდენობის აღნიშვნა რეგულარული გამოხატვის ორ ნაწილს შორის.

მეტახასიათები გვეხმარება სხვადასხვა შესატყვისების გამოყენებაში. მაგრამ როგორ წარმოგიდგენთ მეტახასიათს რეგულარული სიმბოლოთი, ანუ სიმბოლო [(კვადრატული ფრჩხილი) კვადრატული ფრჩხილის მნიშვნელობით? Უბრალოდ:

  • წინ უნდა უძღოდეს ( იცავს) მეტანიშანი (. * + \? ()) უკანა ხაზი. Მაგალითად \. ან \[

ზოგიერთი პერსონაჟის ნაკრების განმარტების გასამარტივებლად, ისინი გაერთიანდნენ ე.წ. პერსონაჟების კლასები და კატეგორიები. POSIX-მა მოახდინა სიმბოლოების გარკვეული კლასის და კატეგორიის დეკლარაციის სტანდარტიზირება, როგორც ეს ნაჩვენებია შემდეგ ცხრილში:

POSIX კლასი ანალოგიურად დანიშნულება
[: ზედა:] დიდი ასოები
[: ქვედა:] მცირე ასოები
[: ალფა:] დიდი და პატარა ასოები
[: alnum:] რიცხვები, დიდი და პატარა ასოები
[: ციფრი:] ნომრები
[: xdigit:] თექვსმეტობითი ციფრები
[: punct:] [.,!?:…] სასვენი ნიშნები
[: ცარიელი:] [\ t] სივრცე და TAB
[: სივრცე:] [\ t \ n \ r \ f \ v] სიმბოლოების გამოტოვება
[: cntrl:] კონტროლის სიმბოლოები
[: გრაფიკი:] [^ \ t \ n \ r \ f \ v] ბეჭდვის სიმბოლოები
[: ბეჭდვა:] [^ \ t \ n \ r \ f \ v] დაბეჭდეთ და გამოტოვეთ სიმბოლოები

რეგექსში არის ასეთი რამ:

სიხარბის რეგექსი

შევეცდები რაც შეიძლება ნათლად აღვწერო. ვთქვათ, გვინდა ვიპოვოთ ყველა HTML ტეგი ზოგიერთ ტექსტში. დავალების ლოკალიზაციით, გვსურს ვიპოვოთ მათ შორის ჩასმული მნიშვნელობები< и >, იმავე ფრჩხილებთან ერთად. მაგრამ ჩვენ ვიცით, რომ ტეგებს განსხვავებული სიგრძე აქვს და თავად ტეგებს, სულ მცირე, 50 ცალი. ყველა მათგანის ჩამოთვლა, მეტანიშვნებით მათი ჩასმა ძალიან შრომატევადი ამოცანაა. მაგრამ ჩვენ ვიცით, რომ გვაქვს გამოხატულება * (წერტილი ვარსკვლავი), რომელიც ახასიათებს სტრიქონში ნებისმიერი სიმბოლოს ნებისმიერ რაოდენობას. ამ გამოთქმის გამოყენებით შევეცდებით ტექსტში მოვძებნოთ (

Ისე, როგორ შევქმნათ RAID დონე 10/50 LSI MegaRAID კონტროლერზე (ასევე მოქმედებს: Intel SRCU42x, Intel SRCS16):

) ყველა მნიშვნელობას შორის< и >... შედეგად, ყველა ხაზი ემთხვევა ამ გამონათქვამს. რატომ, იმიტომ რომ რეგექსი არის გაუმაძღარი და ცდილობს დაიჭიროს ყველა სიმბოლოს შორის< и >, შესაბამისად, მთელი ხაზი, დაწყებული < p> ასე რომ ...და დამთავრებული ...> მიეკუთვნება ამ წესს!

იმედია ეს არის მაგალითი იმისა, თუ რა არის სიხარბე. ამ გაუმაძღრობის თავიდან ასაცილებლად, შეგიძლიათ გაიაროთ შემდეგი გზა:

  • გაითვალისწინეთ სიმბოლოები, არასასურველი ნიმუშის შესატყვისი (მაგალითად:<[^>] *> ზემოაღნიშნული შემთხვევისთვის)
  • გაათავისუფლეთ სიხარბე არახარბ კვანტიფიკატორის განმარტების დამატებით:
    • *? - "არა ხარბი" ("ზარმაცი") ექვივალენტი *
    • +? - "არა ხარბი" ("ზარმაცი") ექვივალენტი +
    • (n,)? - "არა ხარბი" ("ზარმაცი") ექვივალენტურია (n,)
    • *? - "არა ხარბი" ("ზარმაცი") ექვივალენტი. *

ყოველივე ზემოთქმულის დამატება მინდა გაფართოებული რეგულარული გამოხატვის სინტაქსით:

POSIX რეგულარული გამონათქვამები მსგავსია ტრადიციული Unix სინტაქსის, მაგრამ რამდენიმე მეტანიშნის დამატებით:

Პლუსიმიუთითებს იმაზე წინასიმბოლო ან ჯგუფიშეიძლება განმეორდეს ერთჯერ ან მეტჯერ... ვარსკვლავისგან განსხვავებით, საჭიროა მინიმუმ ერთი გამეორება.

Კითხვის ნიშანიაკეთებს წინასიმბოლო ან ჯგუფი სურვილისამებრ. სხვა სიტყვებით რომ ვთქვათ, შესაბამის სტრიქონში ის შეიძლება არ იყოს ან არ იყოსგლუვი ერთიერთხელ.

ვერტიკალური ბარიგამოყოფს ალტერნატიულ რეგულარულ გამონათქვამებს. ერთი სიმბოლო განსაზღვრავს ორ ალტერნატივას, მაგრამ შეიძლება მეტი იყოს, საკმარისია მეტი ვერტიკალური ზოლების გამოყენება. გახსოვდეთ, რომ ეს ოპერატორი იყენებს რაც შეიძლება მეტ გამოხატულებას. ამ მიზეზით, ალტერნატიული ოპერატორი ყველაზე ხშირად გამოიყენება ფრჩხილებში.

ასევე ამოღებულია უკუღმა ხაზების გამოყენება: \ (... \) ხდება (...) და \ (... \) ხდება (...).

პოსტის ბოლოს, აქ მოცემულია რეგექსის გამოყენების რამდენიმე მაგალითი:

$ cat text1 1 ვაშლი 2 მსხალი 3 ბანანი $ grep p text1 1 ვაშლი 2 მსხალი $ grep pea text1 2 მსხალი $ grep "p *" text1 1 ვაშლი 2 მსხალი 3 ბანანი $ grep "pp *" text1 1 ვაშლი 2 მსხალი $ grep " x "text1 $ grep" x * "text1 1 ვაშლი 2 მსხალი 3 ბანანი $ cat text1 | grep "l \ | n" 1 ვაშლი 3 ბანანი $ echo -e "იპოვე \ n * აქ" | grep "\ *" * აქ $ grep "pp \ +" text1 # სტრიქონი, რომელიც შეიცავს ერთ p და 1 ან მეტ p 1 apple $ grep "pl \? e" text1 1 apple 2 pear $ grep "pl \? e" text1 # pe შესაძლო სიმბოლოთი l 1 ვაშლი 2 მსხალი $ grep "p. * r" text1 # p, სტრიქონებში, რომლებიც შეიცავს r 2 მსხალი $ grep "a .." ტექსტი1 # სტრიქონი, რომელსაც მოჰყვება მინიმუმ 2 სიმბოლო 1 ვაშლი 3 ბანანი $ grep "\ (an \) \ +" text1 # მოძებნეთ მეტი გამეორება 3 ბანანი $ grep "an \ (an \) \ +" text1 # მოძებნეთ 2 გამეორება და 3 ბანანი $ grep "" text1 # საძიებო ხაზები 3 ან გვ 1 ვაშლი 2 მსხალი 3 ბანანი $ echo -e "იპოვე \ n * აქ \ nsomewhere." | grep "[. *]" * აქ სადღაც. $ # ეძებს სიმბოლოებს 3-დან 7-მდე $ echo -e "123 \ n456 \ n789 \ n0" | grep "" 123 456 789 $ # ჩვენ ვეძებთ ციფრს, რომელსაც მოჰყვება ასოები n და r სტრიქონის ბოლომდე $ grep "[[: digit:]] [^ nr] * $" text1 1 apple $ sed -e "/ \ (a . * a \) \ | \ (p. * p \) / s / a / A / g "text1 # ჩაანაცვლეთ a A-ით ყველა სტრიქონში, სადაც a მოდის a ან p მოდის p 1 ვაშლი 2 მსხალი 3 bAnAnA $ sed -e "/ ^ [^ lmnXYZ] * $ / s / ყური / თითოეული / გ" text1 # ჩაანაცვლეთ ყური თითოეული ხაზებით, რომელიც არ იწყება lmnXYZ 1 ვაშლი 2 ატამი 3 ბანანი $ echo "პირველი ფრაზა. ეს არის წინადადება. | \ # წინადადებაში ბოლო სიტყვა შეცვალეთ ბოლო სამყაროთი. > sed -e "s / [^] * \ ./ LAST WORD./g" პირველი. ბოლო სიტყვა. ეს არის ბოლო სიტყვა.

ფონი და წყარო:ყველას, ვინც უნდა გამოიყენოს რეგულარული გამონათქვამები, სრულად არ ესმის, როგორ მუშაობს და როგორ შექმნას ისინი. მეც ვეკუთვნოდი ამ ჯგუფს - ვეძებდი რეგულარული გამონათქვამების მაგალითებს, რომლებიც ერგებოდა ჩემს ამოცანებს, ვცდილობდი საჭიროებისამებრ გამომესწორებინა. ჩემთვის ყველაფერი რადიკალურად შეიცვალა წიგნის წაკითხვის შემდეგ. Linux-ის ბრძანების ხაზი (მეორე ინტერნეტ გამოცემა)ავტორი უილიამ ე.შოტსი, უმც.მასში ისე მკაფიოდ არის ჩამოყალიბებული რეგულარული გამონათქვამების მუშაობის პრინციპები, რომ წაკითხვის შემდეგ ვისწავლე მათი გაგება, ნებისმიერი სირთულის რეგულარული გამონათქვამების შექმნა და ახლა ვიყენებ მათ საჭიროების შემთხვევაში. ეს მასალა არის თარგმანი იმ ნაწილისა, რომელიც ეძღვნება რეგულარულ გამონათქვამებს. ეს მასალა განკუთვნილია აბსოლუტური დამწყებთათვის, რომლებსაც საერთოდ არ ესმით, როგორ მუშაობს რეგულარული გამონათქვამები, მაგრამ აქვთ გარკვეული წარმოდგენა იმის შესახებ, თუ როგორ მუშაობს ისინი. იმედია, ეს სტატია დაგეხმარება იმავე მიღწევაში, რაც მე დამეხმარა. თუ აქ მასალა თქვენთვის ახალი არ არის, სცადეთ სტატია Regular Expressions და grep Command დამატებითი ინფორმაციისთვის grep პარამეტრებისა და დამატებითი მაგალითებისთვის.

როგორ გამოიყენება რეგულარული გამონათქვამები

ტექსტური მონაცემები მნიშვნელოვან როლს ასრულებს ყველა Unix-ის მსგავს სისტემაში, როგორიცაა Linux. სხვა საკითხებთან ერთად, ტექსტი არის კონსოლის პროგრამების გამომავალი და კონფიგურაციის ფაილები, მოხსენებები და ა.შ. რეგულარული გამონათქვამებიარის (შესაძლოა) ტექსტთან მუშაობის ერთ-ერთი ყველაზე რთული კონცეფცია, რადგან ისინი მოიცავს აბსტრაქციის მაღალ დონეს. მაგრამ მათ შესწავლაზე დახარჯული დრო პროცენტით გადაიხდის. რეგულარული გამონათქვამების გამოყენების ცოდნა დაგეხმარებათ გასაოცარი რამის გაკეთებაში, თუმცა მათი სრული ღირებულება შეიძლება მაშინვე არ იყოს აშკარა.

ეს სტატია გაგაცნობთ რეგულარული გამონათქვამების გამოყენებას ბრძანებასთან ერთად grep... მაგრამ მათი გამოყენება მხოლოდ ამით არ შემოიფარგლება: რეგულარულ გამონათქვამებს მხარს უჭერს სხვა Linux ბრძანებები, მრავალი პროგრამირების ენა, ისინი გამოიყენება კონფიგურაციაში (მაგალითად, mod_rewrite წესების პარამეტრებში Apache-ში), ასევე ზოგიერთი GUI პროგრამა საშუალებას გაძლევთ დააყენეთ წესები ძებნის / კოპირების / წაშლის მხარდაჭერისგან რეგულარული გამონათქვამებისთვის. პოპულარულ საოფისე პროგრამაში Microsoft Word-შიც კი შეგიძლიათ გამოიყენოთ რეგულარული გამონათქვამები და ველური ბარათები ტექსტის მოსაძებნად და ჩანაცვლებისთვის.

რა არის რეგულარული გამონათქვამები?

მარტივი სიტყვებით, რეგულარული გამოთქმა არის სტენოგრამა, სიმბოლური აღნიშვნა იმ ნიმუშისთვის, რომელიც მოძებნილია ტექსტში. რეგულარული გამონათქვამები მხარდაჭერილია მრავალი ბრძანების ხაზის ხელსაწყოებით და პროგრამირების ენების უმეტესობით და გამოიყენება ტექსტის მანიპულირების პრობლემების გადაჭრაში. თუმცა (თითქოს მათი სირთულე ჩვენთვის საკმარისი არ არის), ყველა რეგულარული გამოთქმა ერთნაირი არ არის. ისინი ოდნავ განსხვავდებიან ხელსაწყოებიდან ინსტრუმენტამდე და პროგრამირების ენიდან ენაზე. ჩვენი განხილვისთვის, ჩვენ შემოვიფარგლებით POSIX სტანდარტში აღწერილი რეგულარული გამონათქვამებით (რომელიც მოიცავს ბრძანების ხაზის ინსტრუმენტების უმეტესობას), განსხვავებით პროგრამირების მრავალი ენისგან (განსაკუთრებით Perl), რომლებიც იყენებენ აღნიშვნების ოდნავ უფრო დიდ და მდიდარ კომპლექტს.

grep

მთავარი პროგრამა, რომელსაც ჩვენ გამოვიყენებთ რეგულარული გამონათქვამებისთვის, არის ჩვენი ძველი მეგობარი. სახელწოდება "grep" რეალურად მომდინარეობს ფრაზიდან "გლობალური რეგულარული გამოხატვის ბეჭდვა", ასე რომ, ჩვენ ვხედავთ, რომ grep აქვს რაღაც საერთო რეგულარულ გამონათქვამებთან. არსებითად, grep ეძებს ტექსტურ ფაილებს ტექსტისთვის, რომელიც შეესაბამება მითითებულ regexp-ს და ბეჭდავს ნებისმიერ ხაზს, რომელიც ემთხვევა მითითებულ სტრიქონს სტანდარტულ გამოსავალზე.

grep-ს შეუძლია მოძებნოს ტექსტი მიღებული სტანდარტული შეყვანით, მაგალითად:

Ls / usr / bin | grep zip

ეს ბრძანება ჩამოთვლის ფაილებს / usr / bin დირექტორიაში, რომელთა სახელები შეიცავს ქვესტრიქონს "zip".

Grep-ს შეუძლია მოძებნოს ტექსტი ფაილებში.

ზოგადი გამოყენების სინტაქსი:

Grep [ოფციები] რეგექსი [ფაილი ...]

  • რეგექსირეგულარული გამოხატულებაა.
  • [ფაილი…]- ერთი ან მეტი ფაილი, რომელშიც განხორციელდება რეგულარული გამოხატვის ძებნა.

[ოფციები] და [ფაილი ...] შეიძლება არ იყოს.

ყველაზე ხშირად გამოყენებული grep პარამეტრების სია:

ვარიანტი აღწერა
-მე საქმეს იგნორირება. ნუ გააკეთებთ განსხვავებას დიდ და პატარა სიმბოლოებს შორის. მისი დაყენება ასევე შესაძლებელია პარამეტრით --იგნორირება-საქმე.
-ვ შებრუნებული შესატყვისი. ჩვეულებრივ grep ბეჭდავს ხაზებს, რომლებიც შეიცავს მატჩს. ეს პარამეტრი იწვევს grep-ის დაბეჭდვას ყველა სტრიქონის, რომელიც არ ემთხვევა. თქვენ ასევე შეგიძლიათ გამოიყენოთ --შებრუნება-შემთხვევა.
-გ დაბეჭდეთ შესატყვისების რაოდენობა (ან შეუსაბამობები, თუ მითითებულია ვარიანტი -ვ) თვით სტრიქონების ნაცვლად. ასევე შეიძლება დაზუსტდეს ოფციით -- ითვლიან.
-ლ თავად ხაზების ნაცვლად, დაბეჭდეთ თითოეული ფაილის სახელი, რომელიც შეიცავს მატჩს. შეიძლება დაზუსტდეს ვარიანტის მიხედვით --ფაილები-შემთხვევებით.
-ლ როგორც ვარიანტი -ლმაგრამ ბეჭდავს მხოლოდ ფაილების სახელებს, რომლებიც არ შეიცავს შესატყვისს. სხვა ვარიანტის სახელი --ფაილები-შემთხვევის გარეშე.
-ნ ამატებს სტრიქონის ნომერს ფაილში თითოეული შესაბამისი ხაზის დასაწყისში. სხვა ვარიანტის სახელი --ხაზის ნომერი.
-თ მრავალ ფაილში მოსაძიებლად, ჩაახშო ფაილის სახელის გამომავალი. თქვენ ასევე შეგიძლიათ მიუთითოთ ვარიანტი --არა-ფაილის სახელი.

grep უფრო სრულად შესასწავლად, მოდით შევქმნათ რამდენიმე ტექსტური ფაილი საძიებლად:

Ls / bin> dirlist-bin.txt ls / usr / bin> dirlist-usr-bin.txt ls / sbin> dirlist-sbin.txt ls / usr / sbin> dirlist-usr-sbin.txt ls dirlist * .txt dirlist -bin.txt dirlist-sbin.txt dirlist-usr-bin.txt dirlist-usr-sbin.txt

ჩვენ შეგვიძლია გავაკეთოთ მარტივი ძებნა ფაილების სიაში, როგორიცაა:

Grep bzip dirlist * .txt dirlist-bin.txt: bzip2 dirlist-bin.txt: bzip2recover

ეს მაგალითი grep ეძებს ყველა ჩამოთვლილ ფაილს bzip სტრიქონისთვის და პოულობს ორ შესატყვისს, ორივე dirlist-bin.txt ფაილში. თუ ჩვენ გვაინტერესებს მხოლოდ შესატყვისების შემცველი ფაილების სია და არა თავად შესატყვისი ხაზები, შეგვიძლია მივუთითოთ ვარიანტი -ლ:

Grep -l bzip dirlist * .txt dirlist-bin.txt

პირიქით, თუ გვინდოდა მხოლოდ ფაილების სიის ნახვა, რომლებიც არ შეიცავდა შესატყვისს, შეგვეძლო ამის გაკეთება:

Grep -L bzip dirlist * .txt dirlist-sbin.txt dirlist-usr-bin.txt dirlist-usr-sbin.txt

თუ გამოსავალი არ არის, მაშინ ფაილები, რომლებიც ემთხვევა პირობებს, ვერ მოიძებნა.

მეტახასიათები და ლიტერალები

მიუხედავად იმისა, რომ ეს შეიძლება აშკარად არ ჩანდეს, ჩვენი grep ძიება ყოველთვის იყენებს რეგულარულ გამონათქვამებს, თუმცა ძალიან მარტივს. რეგულარული გამოთქმა "bzip" ნიშნავს, რომ დამთხვევა მოხდება (ანუ სტრიქონი ჩაითვლება შესაფერისად) მხოლოდ იმ შემთხვევაში, თუ ფაილში სტრიქონი შეიცავს მინიმუმ ოთხ სიმბოლოს და რომ სადმე სტრიქონში არის სიმბოლოები "b", "z". " , "I" და "p" არის ამ თანმიმდევრობით, მათ შორის სხვა სიმბოლოები არ არის. "bzip" სტრიქონში სიმბოლოებია ლიტერალები, ე.ი. პირდაპირი სიმბოლოებიროგორც ისინი შეესაბამება საკუთარ თავს. ლიტერალების გარდა, რეგულარული გამონათქვამები ასევე შეიძლება შეიცავდეს მეტაპერსონაჟებირომლებიც გამოიყენება უფრო რთული შესატყვისების დასაზუსტებლად. რეგულარული გამოხატვის მეტახასიათები შედგება შემდეგისგან:

^ $ . { } - ? * + () | \

ყველა სხვა პერსონაჟი ლიტერალურად ითვლება. უკანა ხაზის სიმბოლოს შეიძლება ჰქონდეს განსხვავებული მნიშვნელობა. იგი გამოიყენება რამდენიმე შემთხვევაში შესაქმნელად მეტა თანმიმდევრობებიდა ასევე საშუალებას აძლევს მეტაპერსონაჟებს გაექცნენ და განიხილონ როგორც ლიტერალები და არა მეტაგმირები.

Შენიშვნა:როგორც ვხედავთ, რეგექსის მეტახასიათებიდან ბევრი ასევე ჭურვის მნიშვნელობის მქონე (შემსრულებელი გაფართოების) სიმბოლოა. რეგულარული გამონათქვამის მითითებისას, რომელიც შეიცავს ბრძანების ხაზის მეტანიშნებს, აუცილებელია მისი ჩასმა ბრჭყალებში, წინააღმდეგ შემთხვევაში გარსი მათ სხვაგვარად განმარტავს და დაარღვევს თქვენს ბრძანებას.

ნებისმიერი პერსონაჟი

პირველი მეტახასიათი, რომლითაც ვიწყებთ ჩვენს გაცნობას წერტილის სიმბოლორაც ნიშნავს "ნებისმიერ პერსონაჟს". თუ ჩავრთავთ რეგექსში, მაშინ ის დაემთხვევა სიმბოლოს ამ პოზიციის ნებისმიერ სიმბოლოს. მაგალითი:

Grep -h ".zip" dirlist * .txt bunzip2 bzip2 bzip2აღდგენა gunzip gzip funzip gpg-zip mzip p7zip preunzip prezip prezip-bin unzip unzipsfx

ჩვენ ვეძებდით ნებისმიერ ხაზს ჩვენს ფაილებში, რომელიც ემთხვევა რეგულარულ გამონათქვამს ".zip". მიღებულ შედეგებში უნდა აღინიშნოს რამდენიმე საინტერესო პუნქტი. გთხოვთ გაითვალისწინოთ, რომ zip პროგრამა ვერ მოიძებნა. ეს იმიტომ ხდება, რომ ჩვენს რეგულარულ გამონათქვამში წერტილის მეტანიშნის ჩართვამ გაზარდა შესატყვისად საჭირო სიგრძე ოთხ სიმბოლომდე და რადგან სახელი "zip" შეიცავს მხოლოდ სამს, ის არ ემთხვევა. ასევე, თუ რომელიმე ფაილი ჩვენს სიაში შეიცავდა .zip ფაილის გაფართოებას, ისინი ასევე ჩაითვლება მოქმედად, რადგან ფაილის გაფართოებაში წერტილის სიმბოლო ასევე ემთხვევა "ნებისმიერი სიმბოლოს" მდგომარეობას.

წამყვანები

მზრუნველი პერსონაჟი ( ^ ) და დოლარის ნიშანი ( $ ) განიხილება რეგულარულ გამონათქვამებში წამყვანები... ეს ნიშნავს, რომ ისინი ემთხვევა მხოლოდ იმ შემთხვევაში, თუ რეგექსი ნაპოვნია ხაზის დასაწყისში ( ^ ) ან ხაზის ბოლოს ( $ ):

Grep -h "^ zip" dirlist * .txt zip zipcloak zipdetails zipgrep zipinfo zipnote zipsplit grep -h "zip $" dirlist * .txt gunzip gzip funzip gpg-zip mzip p7zip preunzip zip prezip prezip unzip.

აქ ჩვენ გადავხედეთ ფაილების სიებს "zip" ხაზისთვის, რომელიც მდებარეობს სტრიქონის დასაწყისში, სტრიქონის ბოლოს, ისევე როგორც იმ ხაზში, სადაც ის იქნება დასაწყისშიც და ბოლოსაც (ანუ მთელი ხაზი შეიცავს მხოლოდ "zip"-ს). გაითვალისწინეთ, რომ რეგულარული გამოთქმა " ^$ "(დასაწყისი და დასასრული, რომელთა შორის არაფერია) ემთხვევა ცარიელ ხაზებს.

მცირე ლირიკული დიგრესია: კროსვორდების ამოხსნის ასისტენტი

რეგულარული გამონათქვამების ჩვენი ამჟამად შეზღუდული ცოდნითაც კი, ჩვენ შეგვიძლია რაიმე სასარგებლო გავაკეთოთ.

თუ თქვენ ოდესმე ამოხსნით კროსვორდებს, მაშინ მოგიწევთ ამოხსნათ ისეთი ამოცანები, როგორიცაა "რა ხუთასოიანი სიტყვაა, სადაც მესამე ასო არის "j", ხოლო ბოლო ასო "r", რაც ნიშნავს ...". ეს კითხვა შეიძლება დამაფიქრებელი იყოს. იცოდით, რომ ლინუქსის ლექსიკონი არსებობს? და ის არის. შეხედეთ / usr / share / dict დირექტორიაში, იქ შეგიძლიათ იპოვოთ ერთი ან მეტი ლექსიკონი. იქ განთავსებული ლექსიკონები არის მხოლოდ სიტყვების გრძელი სია, თითო სტრიქონზე, დალაგებული ანბანის მიხედვით. ჩემს სისტემაში ლექსიკონის ფაილი შეიცავს 99171 სიტყვას. ზემოხსენებულ კროსვორდის კითხვაზე შესაძლო პასუხების მოსაძებნად, ჩვენ შეგვიძლია გავაკეთოთ ეს:

Grep -i "^ .. j.r $" / usr / share / dict / ამერიკულ-ინგლისური მაიორი

ამ რეგულარული გამოთქმის გამოყენებით, ჩვენ შეგვიძლია ვიპოვოთ ყველა სიტყვა ჩვენს ლექსიკონის ფაილში, რომელიც შედგება ხუთი ასოსგან, აქვს "j" მესამე პოზიციაზე და "r" ბოლო პოზიციაზე.

მაგალითში გამოყენებულია ინგლისური ლექსიკონის ფაილი, როგორც ეს სისტემაში ნაგულისხმევად არის წარმოდგენილი. შესაბამისი ლექსიკონის წინასწარ ჩამოტვირთვის შემდეგ, შეგიძლიათ გააკეთოთ სიტყვების მსგავსი ძიება კირილიცაზე ან სხვა სიმბოლოებიდან.

ფრჩხილის გამონათქვამები და სიმბოლოების კლასები

ჩვენს რეგექსის მოცემულ პოზიციაზე რომელიმე პერსონაჟის შესატყვისის გარდა, ჩვენ ასევე ვიყენებთ გამონათქვამები კვადრატულ ფრჩხილებში, შეგვიძლია დავამთხვიოთ ერთი სიმბოლო მითითებული სიმბოლოების ნაკრებიდან. კვადრატულ ფრჩხილებში გამოსახულებებით, ჩვენ შეგვიძლია განვსაზღვროთ სიმბოლოების ნაკრები შესატყვისად (მათ შორის, სიმბოლოები, რომლებიც სხვაგვარად განიმარტება, როგორც მეტანიშანი). ამ მაგალითში ორი სიმბოლოს ნაკრების გამოყენებით:

Grep -h "zip" dirlist * .txt bzip2 bzip2აღდგენა gzip

ჩვენ ვიპოვით ნებისმიერ ხაზს, რომელიც შეიცავს "bzip" ან "gzip" სტრიქონებს.

კომპლექტი შეიძლება შეიცავდეს სიმბოლოების ნებისმიერ რაოდენობას და მეტაგმირები კარგავენ განსაკუთრებულ მნიშვნელობას კვადრატულ ფრჩხილებში მოთავსებისას. თუმცა, არის ორი შემთხვევა, როდესაც კვადრატულ ფრჩხილებში გამოყენებულ მეტანიშნებს განსხვავებული მნიშვნელობა აქვთ. პირველი არის კარეტი ( ^ ), რომელიც გამოიყენება უარყოფის აღსანიშნავად; მეორე არის ტირე ( - ), რომელიც გამოიყენება სიმბოლოების დიაპაზონის დასაზუსტებლად.

უარყოფა

თუ კვადრატულ ფრჩხილებში გამოსახულების პირველი სიმბოლო არის კარეტი ( ^ ), შემდეგ დანარჩენი სიმბოლოები მიიღება სიმბოლოების ერთობლიობად, რომლებიც არ უნდა იყოს მოცემული პერსონაჟის პოზიციაში. მოდით გავაკეთოთ ეს ჩვენი წინა მაგალითის შეცვლით:

Grep -h "[^ bg] zip" dirlist * .txt bunzip2 gunzip funzip gpg-zip mzip p7zip preunzip prezip prezip-bin unzip unzipsfx

როდესაც გააქტიურებულია უარყოფა, მივიღეთ ფაილების სია, რომლებიც შეიცავს სტრიქონს "zip", რომელსაც წინ უძღვის ნებისმიერი სიმბოლო, გარდა "b" ან "g". გთხოვთ გაითვალისწინოთ, რომ zip ვერ მოიძებნა. უარყოფილი სიმბოლოების ნაკრები კვლავ მოითხოვს სიმბოლოს მოცემულ პოზიციაზე, მაგრამ სიმბოლო არ უნდა იყოს ინვერსიული სიმბოლოების ნაკრების წევრი.

ვაგონის სიმბოლო უარყოფილია მხოლოდ იმ შემთხვევაში, თუ ის პირველი სიმბოლოა ფრჩხილებში გამოსახულებაში; წინააღმდეგ შემთხვევაში, ის კარგავს თავის განსაკუთრებულ დანიშნულებას და ხდება ჩვეულებრივი პერსონაჟი ნაკრებიდან.

ტრადიციული ხასიათის დიაპაზონი

თუ გვსურს ავაშენოთ რეგულარული გამოხატულება, რომელიც უნდა მოვძებნოთ ყველა ფაილი ჩვენს სიაში, რომელიც იწყება დიდი ასოებით, შეგვიძლია გავაკეთოთ შემდეგი:

Grep -h "^" dirlist * .txt MAKEDEV GET HEAD POST VBoxClient X X11 Xorg ModemManager NetworkManager VBoxControl VBoxService

დასკვნა ისაა, რომ ჩვენ გამოსახულებაში ჩავსვამთ ყველა 26 დიდ ასოს კვადრატულ ფრჩხილებში. მაგრამ ყველა მათგანის დაბეჭდვის იდეა არ არის ენთუზიაზმი, ამიტომ არსებობს სხვა გზა:

Grep -h "^" dirlist * .txt

3-სიმბოლოიანი დიაპაზონის გამოყენებით, შეგვიძლია შევამოკლოთ 26-ასოიანი ჩანაწერი. სიმბოლოების ნებისმიერი დიაპაზონი შეიძლება იყოს გამოხატული ამ გზით, მათ შორის რამდენიმე დიაპაზონი ერთდროულად, როგორიცაა ეს გამონათქვამი, რომელიც ემთხვევა ყველა ფაილის სახელს, რომელიც იწყება ასოებით და რიცხვებით:

Grep -h "^" dirlist * .txt

სიმბოლოთა დიაპაზონში ჩვენ ვხედავთ, რომ დეფისის სიმბოლო განიხილება სპეციალური გზით, ასე რომ, როგორ შეგვიძლია ჩავრთოთ ტირე სიმბოლო გამოსახულებაში კვადრატულ ფრჩხილებში? გამონათქვამის პირველ სიმბოლოდ ქცევით. მოდით შევხედოთ ორ მაგალითს:

Grep -h "" dirlist * .txt

ეს ემთხვევა ყველა ფაილის სახელს, რომელიც შეიცავს დიდ ასოს. სადაც:

Grep -h "[-AZ]" dirlist * .txt

დაემთხვევა ყველა ფაილის სახელს, რომელიც შეიცავს ტირე ან დიდი "A" ან დიდი "Z".

რეგულარული გამონათქვამები არის ძალიან მძლავრი ინსტრუმენტი შაბლონების შესატყვისი, მანიპულირებისა და სტრიქონების შესაცვლელად და შეიძლება გამოყენებულ იქნას სხვადასხვა ამოცანებისთვის. აქ არის მთავარი:

  • ტექსტის შეყვანის შემოწმება;
  • მოძებნეთ და შეცვალეთ ტექსტი ფაილში;
  • ფაილების ჯგუფური გადარქმევა;
  • ურთიერთქმედება სერვისებთან, როგორიცაა Apache;
  • სტრიქონის შემოწმება ნიმუშის წინააღმდეგ.

ეს არ არის სრული სია, კიდევ ბევრი რამის გაკეთება შეგიძლიათ რეგულარული გამონათქვამებით. მაგრამ ახალი მომხმარებლებისთვის, ისინი შეიძლება ძალიან რთულად გამოიყურებოდეს, რადგან სპეციალური ენა გამოიყენება მათი ფორმირებისთვის. მაგრამ იმ შესაძლებლობების გათვალისწინებით, რაც მას უზრუნველყოფს, Linux-ის რეგულარული გამონათქვამები უნდა იყოს ცნობილი და გამოყენებული ყველა სისტემის ადმინისტრატორის მიერ.

ამ სტატიაში ჩვენ შემოგთავაზებთ ბაშის რეგულარულ გამონათქვამებს დამწყებთათვის, რათა გაიგოთ ამ ხელსაწყოს ყველა მახასიათებელი.

არსებობს ორი ტიპის სიმბოლო, რომელიც შეიძლება გამოყენებულ იქნას რეგულარულ გამონათქვამებში:

  • რეგულარული ასოები;
  • მეტაპერსონაჟები.

რეგულარული სიმბოლოები არის ასოები, რიცხვები და პუნქტუაციის ნიშნები, რომლებიც ქმნიან ნებისმიერ სტრიქონს. ყველა ტექსტი შედგება ასოებისგან და შეგიძლიათ გამოიყენოთ ისინი რეგულარულ გამონათქვამებში ტექსტში სასურველი პოზიციის მოსაძებნად.

მეტახასიათები სხვა რამეა, ისინი აძლევენ ძალას რეგულარულ გამონათქვამებს. მეტაპერსონაჟებით თქვენ შეგიძლიათ გააკეთოთ ბევრად მეტი, ვიდრე ერთი პერსონაჟის ძიება. შეგიძლიათ მოძებნოთ სიმბოლოების კომბინაციები, გამოიყენოთ სიმბოლოების დინამიური რაოდენობა და აირჩიოთ დიაპაზონები. ყველა სპეციალური სიმბოლო შეიძლება დაიყოს ორ ტიპად, ეს არის შემცვლელი სიმბოლოები, რომლებიც ცვლის ჩვეულებრივ სიმბოლოებს, ან ოპერატორები, რომლებიც მიუთითებენ რამდენჯერ შეიძლება განმეორდეს სიმბოლო. რეგულარული გამოხატვის სინტაქსი ასე გამოიყურება:

რეგულარული_პერსონაჟი სპეციალური სიმბოლო_ოპერატორი

სპეციალური სიმბოლოს_ჩანაცვლება სპეციალური სიმბოლო_ოპერატორი

  • - პირდაპირი მნიშვნელობით სპეციალური სიმბოლოები იწყება უკანა ხაზით და ის ასევე გამოიყენება, თუ საჭიროა სპეციალური სიმბოლოს გამოყენება პუნქტუაციის ნიშნის სახით;
  • ^ - მიუთითებს ხაზის დასაწყისს;
  • $ - მიუთითებს ხაზის დასასრულს;
  • * - მიუთითებს, რომ წინა სიმბოლო შეიძლება განმეორდეს 0 ან მეტჯერ;
  • + - მიუთითებს, რომ წინა სიმბოლო უნდა განმეორდეს ერთზე მეტჯერ ან მეტჯერ;
  • ? - წინა სიმბოლო შეიძლება იყოს ნულოვანი ან ერთხელ;
  • (n)- მიუთითებს რამდენჯერ (n) გაიმეოროს წინა სიმბოლო;
  • (N, n)- წინა სიმბოლო შეიძლება განმეორდეს N-დან n-მდე;
  • . - ნებისმიერი სიმბოლო ხაზის არხის გარდა;
  • - ფრჩხილებში მითითებული ნებისმიერი სიმბოლო;
  • x | y- სიმბოლო x ან სიმბოლო y;
  • [^ az]- ფრჩხილებში მითითებულის გარდა ნებისმიერი სიმბოლო;
  • - ნებისმიერი სიმბოლო მითითებული დიაპაზონიდან;
  • [^ ა-ზ]- ნებისმიერი სიმბოლო, რომელიც არ არის დიაპაზონში;
  • - აღნიშნავს სიტყვის საზღვარს ინტერვალით;
  • - ნიშნავს, რომ სიმბოლო უნდა იყოს სიტყვაში, მაგალითად, ux ემთხვევა uxb ან tuxedo, მაგრამ არ ემთხვევა Linux-ს;
  • - ნიშნავს, რომ სიმბოლო არის ციფრი;
  • - არაციფრული სიმბოლო;
  • - ხაზის შესანახი ხასიათი;
  • - ერთ-ერთი სიმბოლოს სივრცე, სივრცე, ჩანართი და ა.შ.
  • - ნებისმიერი სიმბოლო, გარდა სივრცისა;
  • - ცხრილის სიმბოლო;
  • - ვერტიკალური ჩანართის სიმბოლო;
  • - ნებისმიერი ანბანური სიმბოლო, ქვედა ხაზის ჩათვლით;
  • - ნებისმიერი ანბანური სიმბოლო ხაზგასმის გარდა;
  • uXXX- უნიკდოს სიმბოლო.

მნიშვნელოვანია აღინიშნოს, რომ წინ დახრილი უნდა იყოს გამოყენებული პირდაპირი მნიშვნელობით სპეციალური სიმბოლოების წინ, რათა მიუთითებდეს, რომ სპეციალური სიმბოლო არის შემდეგი. საპირისპიროა ასევე, თუ გსურთ გამოიყენოთ სპეციალური სიმბოლო, რომელიც გამოიყენება სლეშის გარეშე, როგორც ჩვეულებრივი სიმბოლო, მაშინ უნდა დაამატოთ სლეი.

მაგალითად, დავუშვათ, რომ გსურთ იპოვოთ სტრიქონი 1+ 2 = 3 ტექსტში. თუ ამ სტრიქონს იყენებთ როგორც რეგულარულ გამოხატულებას, ვერაფერს იპოვით, რადგან სისტემა განმარტავს პლუსს, როგორც სპეციალურ სიმბოლოს, რომელიც ამბობს, რომ წინა ერთეული უნდა განმეორდეს ერთხელ ან მეტჯერ. ასე რომ, საჭიროა მისი გაქცევა: 1 + 2 = 3. გაქცევის გარეშე, ჩვენი რეგექსი დაემთხვა მხოლოდ სტრიქონს 11 = 3 ან 111 = 3 და ა.შ. არ არის საჭირო ტოლების წინ ხაზის დაყენება, რადგან ეს არ არის განსაკუთრებული სიმბოლო.

რეგულარული გამონათქვამების გამოყენების მაგალითები

ახლა, როდესაც ჩვენ განვიხილეთ საფუძვლები და თქვენ იცით, როგორ მუშაობს ყველაფერი, რჩება პრაქტიკაში ლინუქსის grep რეგულარული გამონათქვამების შესახებ მიღებული ცოდნის კონსოლიდაცია. ორი ძალიან სასარგებლო სპეციალური სიმბოლოა ^ და $, რომლებიც აღნიშნავენ ხაზის დასაწყისს და დასასრულს. მაგალითად, ჩვენ გვინდა, რომ ყველა მომხმარებელი დარეგისტრირდეს ჩვენს სისტემაში, რომელთა სახელი იწყება s. შემდეგ შეიძლება გამოყენებულ იქნას რეგულარული გამოხატულება "^ S"... შეგიძლიათ გამოიყენოთ egrep ბრძანება:

egrep "^ s" / etc / passwd

თუ გვსურს ხაზების შერჩევა სტრიქონის ბოლო სიმბოლოს მიხედვით, ამისთვის შეგვიძლია გამოვიყენოთ $. მაგალითად, ავირჩიოთ სისტემის ყველა მომხმარებელი, ჭურვის გარეშე, ჩანაწერები ასეთი მომხმარებლების შესახებ მთავრდება ყალბით:

egrep "false $" / etc / passwd

მომხმარებლის სახელების დასაბეჭდად, რომლებიც იწყება s ან d-ით, გამოიყენეთ ასეთი გამოხატულება:

egrep "^" / etc / passwd

იგივე შედეგის მიღება შესაძლებელია "|" სიმბოლოს გამოყენებით. პირველი ვარიანტი უფრო შესაფერისია დიაპაზონებისთვის, ხოლო მეორე უფრო ხშირად გამოიყენება რეგულარული ან / და:

egrep "^" / etc / passwd

ახლა ავირჩიოთ ყველა მომხმარებელი, რომელთა სახელი სამზე მეტი სიმბოლოა. მომხმარებლის სახელი მთავრდება ორი წერტილით. შეგვიძლია ვთქვათ, რომ ის შეიძლება შეიცავდეს ნებისმიერ ანბანურ სიმბოლოს, რომელიც უნდა განმეორდეს სამჯერ, ორწერტილამდე:

egrep "^ w (3):" / etc / passwd

დასკვნები

ჩვენ განვიხილეთ Linux-ის რეგულარული გამონათქვამები ამ სტატიაში, მაგრამ ეს მხოლოდ საფუძვლები იყო. თუ ცოტა ჩაღრმავდებით, აღმოაჩენთ, რომ ამ ხელსაწყოს საშუალებით კიდევ ბევრი საინტერესო რამის გაკეთება შეგიძლიათ. რეგულარული გამოთქმების შესწავლაზე დახარჯული დრო ნამდვილად ღირს.

დასასრულს, Yandex-ის ლექცია რეგულარული გამონათქვამების შესახებ:

რეგულარული გამოხატულება- ტექსტის ნიმუში, რომელიც შედგება ასოების, რიცხვებისა და სპეციალური სიმბოლოების კომბინაციისგან, რომელიც ცნობილია მეტანიშვნების სახელით. რეგულარული გამონათქვამების ახლო ბიძაშვილი არის ველური გამონათქვამები, რომლებიც ხშირად გამოიყენება ფაილების მართვაში. რეგულარული გამონათქვამები ძირითადად გამოიყენება ტექსტის შედარებისა და ძიებისთვის. ფართოდ გამოიყენება სინტაქსის გასაანალიზებლად.

UNIX-ის მომხმარებლები იცნობენ რეგულარულ გამონათქვამებს grep, sed, awk (ან gawk) და ed. ამ პროგრამების ან მათი ანალოგების გამოყენებით, შეგიძლიათ სცადოთ და გადაამოწმოთ ქვემოთ მოცემული მაგალითები. ტექსტის რედაქტორები, როგორიცაა (X) Emacs და vi, ასევე ხშირად იყენებენ რეგულარულ გამონათქვამებს. რეგულარული გამონათქვამების ყველაზე ცნობილი და ფართო გამოყენება პერლის ენაზეა. პროგრამული უზრუნველყოფის შემქმნელისთვის და სისტემის ადმინისტრატორისთვის რთულია რეგულარული გამონათქვამების ცოდნის გარეშე.

მეტაპერსონაჟები

ასე რომ, სტრიქონები შეიძლება შედგებოდეს ასოებით, რიცხვებით და მეტანიშვნებით. მეტახასიათებია:

\ | () { } ^ $ * + ? . < >

მეტაგმირებს შეუძლიათ შეასრულონ შემდეგი როლები რეგულარულ გამოხატულებაში:

    რაოდენობრივი მაჩვენებელი

    განცხადება;

    ჯგუფის ნიშანი;

    ალტერნატივა;

    თანმიმდევრობის ნიშანი

რაოდენობები

* (ვარსკვლავი) მეტანიშანი ცვლის 0 ან მეტ სიმბოლოს. + (პლუს) მეტანიშანი ცვლის 1 ან მეტ სიმბოლოს. მეტახასიათი. (წერტილი) ცვლის ზუსტად 1 თვითნებურ სიმბოლოს. მეტახასიათი? (კითხვის ნიშანი) ცვლის 0 ან 1 სიმბოლოს. განსხვავება * და +-ის გამოყენებაში ისეთია, რომ მოთხოვნა, რომ იპოვოთ სტრიქონი *-ით, დააბრუნებს ნებისმიერ სტრიქონს, მათ შორის ცარიელებს, ხოლო მოთხოვნა +-ით დააბრუნებს მხოლოდ c სიმბოლოს შემცველ სტრიქონებს.

ცარიელი ხაზები ემორჩილება შემდეგ კონვენციებს: ცარიელი ხაზი შეიცავს ერთ და მხოლოდ ერთ ცარიელ ხაზს; ცარიელი ხაზი შეიცავს ცარიელ ხაზებს თითოეული სიმბოლოს წინ და ასევე სტრიქონის ბოლოს.

რეგულარულ გამონათქვამებში ასევე გამოიყენება (n, m) კონსტრუქცია, რაც ნიშნავს, რომ კონსტრუქციის წინა სიმბოლო სტრიქონში n-დან m-ჯერ გვხვდება. რიცხვის m გამოტოვება ნიშნავს უსასრულობას. იმათ. კონსტრუქციის განსაკუთრებული შემთხვევებია შემდეგი ჩანაწერები: (0,), (1,) და (0,1). პირველი ემთხვევა *, მეორე ემთხვევა + მეტახასიათს და მესამე ემთხვევა? ... ამ თანასწორობების მიღება ადვილია შესაბამისი რაოდენობების განსაზღვრებიდან. გარდა ამისა, კონსტრუქცია (n) ნიშნავს, რომ სიმბოლო ჩნდება ზუსტად n-ჯერ.

ზოგიერთი სასვენი ნიშნისა და მათემატიკური სიმბოლოების მეტანიშანებად გამოყენებასთან დაკავშირებით შემოვიდა დამატებითი მეტანიშანი \ (უკუღმა, უკუღმა), რომელიც მეტანიშნის წინ დაწერისას ამ უკანასკნელს ჩვეულებრივ სიმბოლოდ აქცევს. იმათ. ? არის რაოდენობრივი მაჩვენებელი და \? - კითხვის ნიშანი.

ჯგუფები

ზემოთ აღწერილი რაოდენობები, როგორც უკვე აღვნიშნეთ, მოქმედებენ მათთან ყველაზე ახლოს მარცხნივ (ბოლო წინა) პერსონაჟზე. მაგრამ ეს შეზღუდვა საშუალებას გაძლევთ გვერდის ავლით ჯგუფებს მეტაგმირების აღნიშვნაში (და). ეს სიმბოლოები ამოიღებენ ქვეგამოხატვას გამონათქვამიდან, დაჯგუფებული ჯგუფად, რომელზედაც გამოიყენება კვანტიფიკატორი.

მაგალითი:

ნიშნავს (ან ცვლის)

ჰო ხო ჰო ჰო ჰო ჰო ჰოჰო

შესაძლებელია ქვეგამოთქმების ბუდობა, ე.ი. უფრო მოკლე ქვეგამოთქმები შეიძლება ამოღებულ იქნეს ქვეგამოსახულებიდან.

ალტერნატივები

ჩამოყალიბებულია მეტახასიათის გამოყენებით | (ვერტიკალური ზოლი), რომელიც აღნიშნავს ლოგიკურ "ან".

მაგალითი: რეგულარული გამოხატვის ძროხები (a | s | e | y | oops | oy)? აზუსტებს სიტყვის „ძროხას“ ყველა შესაძლო დაბოლოებას მხოლობით რიცხვში შემთხვევებისთვის.

მტკიცებები

გამოყოფილია მეტანიშვნები, რომლებიც აღნიშნავენ სპეციალურ ობიექტებს - ნულოვანი სიგრძის სტრიქონებს, რომლებიც გამოიყენება მათ წინა ან მომდევნო ტექსტის ადგილის დასადგენად. ასეთ ობიექტებს განცხადებები ეწოდება. შემდეგი განცხადებები არსებობს რეგულარულ გამონათქვამებში:

^ ხაზის დასაწყისი $ ხაზის დასასრული< начало слова >სიტყვის დასასრული

მაგალითი: რეგულარული გამოხატულება $ ემთხვევა სტრიქონს, რომელიც იწყება The-ით.

შენიშვნა: ჩვეულებრივი სიმბოლოები შეიძლება განიხილებოდეს, როგორც ნულოვანი სიგრძის განცხადებები.

მიმდევრობები

სპეციალური კონსტრუქცია, რომელიც ჩასმულია [და] მეტანიშვნებში (კვადრატულ ფრჩხილებში), საშუალებას გაძლევთ ჩამოთვალოთ სიმბოლოების ვარიანტები, რომლებიც შეიძლება გამოჩნდეს რეგულარულ გამოხატულებაში მოცემულ ადგილას და ეწოდება თანმიმდევრობა. კვადრატულ ფრჩხილებში ყველა მეტანიშანი განიხილება როგორც მარტივი სიმბოლო, ხოლო სიმბოლოები - (მინუს) და ^ იძენენ ახალ მნიშვნელობას: პირველი საშუალებას გაძლევთ მიუთითოთ სიმბოლოების უწყვეტი თანმიმდევრობა მითითებულ ორს შორის, ხოლო მეორე იძლევა ლოგიკურ "არა" ( უარყოფა). შემდეგი მაგალითები ყველაზე მარტივი გასათვალისწინებელია:

ნებისმიერი პატარა ლათინური ასო:

ლათინური ალფაციფრული სიმბოლო (a-დან z-მდე, A-დან Z-მდე და 0-დან 9-მდე):

არა ლათინური ალფაციფრული სიმბოლო:

[^ a-zA-Z0-9]

ნებისმიერი სიტყვა (დეფისების, მათემატიკური სიმბოლოების და რიცხვების გარეშე):

<+>

სიმარტივისა და სიმარტივისთვის შემოღებულია შემდეგი აბრევიატურები:

\ d ციფრი (ე.ი. ემთხვევა გამონათქვამს); \ D არ არის ციფრი (ანუ [^ 0-9]); \ w ლათინური სიტყვა (ალფანუმერული); \ W არის სიმბოლოების თანმიმდევრობა სივრცეების გარეშე, რომელიც არ არის ლათინური ანბანური სიტყვა ([^ a-zA-Z0-9]); \ s ცარიელი სივრცე [\ t \ n \ r \ f], ე.ი სივრცეები, ჩანართები და ა.შ. \ S არის არა ცარიელი დიაპაზონი ([^ \ t \ n \ r \ f]).

ურთიერთობა wildcards-თან

ყველა მომხმარებელი ალბათ იცნობს ველურ ბარათებს. wildcard გამოხატვის მაგალითია * .jpg, რომელიც აღნიშნავს ყველა ფაილს jpg გაფართოებით. რით განსხვავდება რეგულარული გამონათქვამები ველური ბარათებისგან? განსხვავებები შეიძლება შეჯამდეს სამ წესში თვითნებური ბუნების გამოხატვის რეგულარულ გამოსახულებად გადაქცევისთვის:

    შეცვალა.*

    ჩანაცვლება? ზე.

    შეცვალეთ ყველა სიმბოლო, რომელიც ემთხვევა მეტახასიათებს მათი უკუღმა დახრილი ვარიანტებით.

მართლაც, რეგულარულ გამოხატულებაში ჩაწერა * უსარგებლოა და იძლევა ცარიელ სტრიქონს, ვინაიდან ნიშნავს, რომ ცარიელი სტრიქონი მეორდება რამდენჯერმე. და აქ * (გაიმეორეთ თვითნებური სიმბოლო რამდენჯერაც გსურთ, მათ შორის 0) მნიშვნელობით ზუსტად ემთხვევა * სიმბოლოს ველური ბარათების ნაკრებში.

* .jpg შესაბამისი რეგულარული გამოხატულება ასე გამოიყურება: * \. Jpg. მაგალითად, wildcard თანმიმდევრობები ez * .pp ემთხვევა ორ ეკვივალენტურ რეგულარულ გამონათქვამს, ez. * \. Pp და ez. * \. (Cpp | hpp).

რეგულარული გამოხატვის მაგალითები

ელ.ფოსტა ფორმატში [ელფოსტა დაცულია]

+(\.+)*@+(\.+)+

ელ.ფოსტა ფორმატში „ივან ივანოვი "

("? +"? [\ t] *) + \<+(\.+)*@+(\.+)+\>

ვებ პროტოკოლის შემოწმება URL-ში (http: //, ftp: // ან https: //)

+://

ზოგიერთი C/C ++ ბრძანება და დირექტივა:

^ # მოიცავს [\ t] + [<"][^>"] + [">] - შეიცავდეს დირექტივას

//.+$ - კომენტარი ერთ ხაზზე

/ \ * [^ *] * \ * / - კომენტარი რამდენიმე სტრიქონზე

-? + \. + - მცურავი წერტილის ნომერი

0x + არის თექვსმეტობითი რიცხვი.

და აი, მაგალითად, პროგრამა სიტყვის ძროხის მოსაძებნად:

grep -E "ძროხა | ვაჩე" *> / dev / null && echo "იპოვა ძროხა"

აქ -E ვარიანტი გამოიყენება გაფართოებული რეგულარული გამოხატვის სინტაქსის მხარდაჭერის გასააქტიურებლად.

ეს ტექსტი ეფუძნება იან ბორსოდის სტატიას HOWTO-regexps.htm ფაილიდან

უწყვეტი გამოხატულება არის ნიმუში, რომელიც აღწერს სტრიქონების ერთობლიობას. რეგულარული გამოსახულებები აგებულია არითმეტიკული გამონათქვამების მსგავსად, სხვადასხვა ოპერატორების გამოყენებით პატარა გამონათქვამების გაერთიანებისთვის.

უწყვეტი გამონათქვამები (ინგლისური რეგულარული გამონათქვამები, შემოკლებით RegExp, RegEx, jarg. Regexps ან regexes) არის სისტემა ტექსტის ფრაგმენტების გარჩევისთვის ფორმალიზებული შაბლონის მიხედვით, რომელიც დაფუძნებულია საძიებო ნიმუშების წერის სისტემაზე. ნიმუში განსაზღვრავს ძიების წესს, რუსულ ენაზე ასევე ზოგჯერ დააწკაპუნეთ "ნიღაბი", "ნიღაბი". რეგულარულმა გამონათქვამებმა გარღვევა მოახდინეს ელექტრონული შინაარსის დამუშავებაში მე-20 საუკუნის ბოლოს. ისინი წარმოდგენილია ველური სიმბოლოების განვითარებით.

მუდმივი გამონათქვამები ახლა გამოიყენება მრავალი ტექსტური რედაქტორის მიერ, რათა მოძებნონ და შეცვალონ ტექსტი შერჩეული წესების საფუძველზე. თითქმის ბევრი პროგრამირების ენა მხარს უჭერს რეგულარულ გამონათქვამებს სიმების მანიპულირებისთვის. მაგალითად, Java, .NET Framework, Perl, PHP, JavaScript, Python და სხვებს აქვთ ჩაშენებული მხარდაჭერა მუდმივი გამონათქვამებისთვის. კომუნალური საშუალებების ერთობლიობა (მათ შორის sed რედაქტორი და grep ფილტრი), რომელიც UNIX დისტრიბუციების მიერ მიჩნეული იყო ერთ-ერთი ყველაზე ადრეული, დაეხმარა რეგულარული გამონათქვამების კონცეფციის პოპულარიზაციას.

Linux ტერმინალში ერთ-ერთი ყველაზე სასარგებლო და ფუნქციებით მდიდარი ბრძანება არის "grep" ბრიგადა. Grep არის აკრონიმი, რომელიც ნიშნავს "გლობალური რეგულარული გამოხატვის ბეჭდვას" (ანუ, ყველგან მოიძიეთ სტრიქონები, რომლებიც ემთხვევა მუდმივ გამოხატულებას და დაბეჭდეთ ისინი").

ეს ნიშნავს, რომ შეგიძლიათ გამოიყენოთ grep, რათა ნახოთ, შეესაბამება თუ არა თქვენი შეყვანა მოცემულ შაბლონს. უმარტივესი ფორმით, grep გამოიყენება ტექსტურ ფაილში ასოების ნიმუშების შესატყვისების მოსაძებნად. ეს ნიშნავს, რომ თუ grep შეიძენს საძიებო სიტყვას, ის დაბეჭდავს ყველა სტრიქონს ფაილში, რომელიც ინახავს ამ სიტყვას.

grep-ის მიზანია სტრიქონების მოძიება რეგულარული გამოხატვის მდგომარეობის მიხედვით. ცვლილებებია კლასიკურ გრეპში - egrep, fgrep, rgrep. ყველა მათგანი სრულყოფილად არის მორგებული კონკრეტული მიზნებისთვის, ხოლო grep-ის შესაძლებლობები გადაფარავს ყველა ფუნქციას. ბრძანების გამოყენების ყველაზე მარტივი მაგალითია სტრიქონის გამოტანა, რომელიც შეესაბამება ნიმუშის ფაილს. მაგალითად, ჩვენ გვინდა ვიპოვოთ ხაზი, რომელიც ინახავს "მომხმარებელს" ფაილში /etc/mysql/my.cnf. ამისათვის ჩვენ გამოვიყენებთ შემდეგ ბრძანებას:

Grep მომხმარებელი /etc/mysql/my.cnf

Grep-ს შეუძლია უბრალოდ მოძებნოს კონკრეტული სიტყვა:

Grep გამარჯობა ./example.cpp

ან სტრიქონი, მაგრამ ამ შემთხვევაში ის უნდა იყოს ჩასმული ბრჭყალებში:

Grep "Hello World" ./example.cpp

გარდა ამისა, პროგრამის ალტერნატივებია egrep და fgrep, რომლებიც იგივეა რაც grep -E და grep -F, შესაბამისად. egrep და fgrep არომატები მოძველებულია, მაგრამ მუშაობს უკანა თავსებადობაზე. რეკომენდირებულია გამოიყენოთ grep -E და grep -F მოძველებული ვარიანტების ნაცვლად.

grep ბრძანება ემთხვევა წყაროს ფაილების ხაზებს შაბლონთან, ამ ძირითად რეგულარულ გამონათქვამთან. თუ ფაილები არ არის მითითებული, გამოიყენება სტანდარტული შეყვანა. ჩვეულებისამებრ, ყოველი წარმატებით შესაბამისი ხაზი კოპირდება სტანდარტულ გამომავალზე; თუ
ცოტა წყარო ფაილი, ფაილის სახელი იბეჭდება ნაპოვნი ხაზის წინ. ძირითადი უწყვეტი გამონათქვამები (გამონათქვამები, რომლებსაც აქვთ სიმბოლოების სტრიქონები, როგორც მათი მნიშვნელობა და იყენებენ ალფანუმერული და სპეციალური სიმბოლოების შეზღუდულ დიაპაზონს) მიიღება შაბლონებად.

egrep-ის გამოყენება Linux-ში

Egrep ან grep -E არის grep ან Extended grep-ის განსხვავებული ვერსია. grep-ის ეს ვერსია შესანიშნავი და სწრაფია, როდესაც საქმე ეხება რეგექსის ნიმუშის ძიებას, რადგან ის ეპყრობა მეტახასიათებს ისე, როგორც არის და არ ცვლის მათ, როგორც სტრიქონებს. Egrep იყენებს ERE ან Extended Extended Expression-ს.

egrep არის ამოღებული ზარი grep-ზე -E გადამრთველით. ის განსხვავდება grep-ისგან POSIX სიმბოლოების კლასების გამოყენებით გაფართოებული უწყვეტი გამონათქვამების გამოყენების შესაძლებლობით. პრობლემა ხშირად ჩნდება სიტყვების ან გამოსახულებების პოვნაში, რომლებიც მიეკუთვნება იმავე ტიპს, მაგრამ მართლწერის შესაძლო ვარიაციებით, როგორიცაა თარიღები, ფაილის სახელები გარკვეული გაფართოებით და სტანდარტული სახელით, ელფოსტის მისამართები. მეორეს მხრივ, არსებობს ამოცანები კარგად განსაზღვრული სიტყვების მოსაძებნად, რომლებსაც შეიძლება ჰქონდეთ განსხვავებული ფორმები, ან ძიება, რომელიც გამორიცხავს ცალკეულ სიმბოლოებს ან პერსონაჟების კლასებს.

ჭეშმარიტების ამ მიზნებისთვის, ზოგიერთი სისტემა შეიქმნა შაბლონების გამოყენებით ტექსტის აღწერილობის საფუძველზე. მუდმივი გამონათქვამები ასევე რეიტინგულია ასეთ სისტემებს შორის. ორი ძალიან სასარგებლო სპეციალური სიმბოლოა ^ და $, რომლებიც აღნიშნავენ ხაზის დასაწყისს და დასასრულს. მაგალითად, ჩვენ გვინდა, რომ ყველა მომხმარებელი დარეგისტრირდეს ჩვენს სისტემაში, რომელთა სახელი იწყება s. შემდეგ შეიძლება გამოყენებულ იქნას რეგულარული გამოთქმა "^ s". შეგიძლიათ გამოიყენოთ ეგრეპ ბრიგადა:

Egrep "^ s" / etc / passwd

შესაძლებელია რამდენიმე ფაილში მოძიება და ასეთ შემთხვევაში, ფაილის სახელი გამოჩნდება ხაზის წინ.

ეგრეპ -ი გამარჯობა ./example.cpp ./example2.cpp

და შემდეგი მოთხოვნა აჩვენებს ყველა კოდს, მხოლოდ კომენტარების შემცველი ხაზების გამოკლებით:

ეგრეპ -ვ ^ / ./example.cpp

როგორც egrep, მაშინაც კი, თუ თქვენ არ მოერიდებით მეტახასიათებს, ბრძანება განიხილავს მათ, როგორც სპეციალურ სიმბოლოებს და ჩაანაცვლებს მათ განსაკუთრებული მნიშვნელობით, ნაცვლად იმისა, რომ განიხილოს ისინი, როგორც სტრიქონი.

Fgrep-ის გამოყენება Linux-ზე

Fgrep ან Fixed grep ან grep -F არის grep-ის კიდევ ერთი ვერსია, რომელიც საჭიროა, როდესაც საქმე ეხება რეგულარული კონცეფციის ნაცვლად მთელი ხაზის ძიებას, რადგან ის არ ცნობს რეგულარულ გამონათქვამებს ან მეტანიშნებს. ნებისმიერი ხაზის საძიებლად პირდაპირ აირჩიეთ grep-ის ეს ვერსია.

Fgrep ეძებს სრულ სტრიქონს და არ ცნობს სპეციალურ სიმბოლოებს, როგორც უწყვეტი გამონათქვამის ნაწილს, მიუხედავად იმისა, არის თუ არა სიმბოლოების გაქცევა.

Fgrep -C 0 "(f | g) ile" check_file fgrep -C 0 "\ (f \ | g \) ile" check_file

sed-ის გამოყენება Linux-ზე

sed (ინგლისური Stream EDitor-დან) არის ნაკადის ტექსტის რედაქტორი (ისევე როგორც პროგრამირების ენა), რომელიც იყენებს სხვადასხვა წინასწარ განსაზღვრულ ტექსტის ტრანსფორმაციას ტექსტის თანმიმდევრულ ნაკადში. Sed შეიძლება განადგურდეს grep-ის მსგავსად, გამომავალი ხაზები ძირითადი რეგექსის ნიმუშის მიხედვით:

Sed -n / Hello / p ./example.cpp

შეიძლება გამოყენებულ იქნას ხაზების წასაშლელად (ყველა ცარიელი ხაზის წაშლა):

Sed / ^ $ / d ./example.cpp

სედთან მუშაობის მთავარი ინსტრუმენტი არის გამონათქვამი, როგორიცაა:

Sed s / lookup_expression / what_replace / ფაილის სახელი

ასე რომ, ნიმუში, თუ აწარმოებთ ბრძანებას:

Sed s / int / long / ./example.cpp

განსხვავებები "grep", "egrep" და "fgrep" განხილულია ზემოთ. გამოყენებული რეგულარული წარმოდგენების ნაკრებისა და შესრულების სიჩქარის განსხვავებების მიუხედავად, ბრძანების ხაზის ვარიანტები იგივე რჩება grep-ის სამივე ვერსიისთვის.

გააზიარე ეს