Menü
Bedava
giriş
ana  /  Programlar / Normal UNIX ifadeleri. Linux'ta Düzenli İfadeler (Regex) kullanma

Düzenli Unix ifadeleri. Linux'ta Düzenli İfadeler (Regex) kullanma

Orijinal: Linux Temelleri
Gönderen: Paul Cobbaut
Yayın Tarihi: 16 Ekim 2014
Tercüme: A.Panin
Tercüme Tarihi: 17 Aralık 2014

Bölüm 19. Düzenli ifadeler

Düzenli ifadelerin mekanizması çok güçlü bir Linux aracıdır. Düzenli ifadeler Bash, VI, Rename, GREP, SED ve diğerleri gibi çeşitli programlarla çalışırken kullanılabilir.

Bu bölüm, normal ifadeler hakkında temel bilgileri sunar.

Düzenli ifade sözdizimi sürümleri

Düzenli ifadelerin üç farklı versiyonu vardır.

Kullanılan alete bağlı olarak, belirtilen bir veya daha fazla belirten kullanılabilir.

Örneğin, GREP aracı, normal bir ifadeyi analiz ederken, normal bir ifadeyi analiz ederken normal ifadeleri (ERE) sözdizimini (ERE) kullanmanıza izin veren bir parametreyi destekler. Düzenli ifadeler (BRE) ve -P parametresi - Perl Programlama Dilinin (PCRE) normal ifadelerinin sözdizimi.

Grep aracının ayrıca, işlem yapmadan normal bir ifadeyi okumanıza izin veren -F parametresini de desteklemektedir.

SED aracı ayrıca normal ifadelerin sözdizimini seçmek için parametreleri destekler.

Kullanılan enstrümanların yönergelerini daima okuyun!

Yardımcı GREP.

Şablonla eşleşen dizelerin sonuçları

GREP Utility, belirli bir şablonla eşleşen satırları aramak için tasarlanmış popüler bir Linux aracıdır. Aşağıda, onunla çalışırken kullanılabilecek en basit düzenli ifadelerin örnekleri bulunmaktadır.

Bu, örneklerde kullanılan test dosyasının içeriğidir. Bu dosya üç satır (veya yeni bir satırın üç sembolü) içerir. [E-posta Korumalı]: ~ $ Kedi Adları Tania Laura Valentina

Ayrı bir karakter ararken, yalnızca belirtilen bir sembol içeren bu çizgiler görüntülenecektir. [E-posta Korumalı]: ~ $ Grep u laura isimleri [E-posta Korumalı]: ~ $ GREP E Valentina adları [E-posta Korumalı]: ~ $ Grep ben tania valentina isimleri

Bu örnekte kullanılan şablonla bir karşılaştırma açıktır; Belirtilen sembolün dizede bulunması durumunda, GREP yardımcı programı bu dizgiyi görüntüler.

Sembollerin birleştirilmesi

Çizgilerdeki karakter kombinasyonlarını aramak için, normal ifadenin sembolleri aynı şekilde birleştirilmelidir.

Bu örnek, GREP yardımcı programının çalışma prensibini, normal ifadenin Tan IA dizgisine karşılık geleceği, ancak VA ödünç vermeyeceğini ve bir çizgideki valentteki normal ifadeyi değil, ancak Ta ni a. [E-posta Korumalı]: ~ $ GREP A İsimleri Tania Laura Valentina [E-posta Korumalı]: ~ $ GREP IA tania adları [E-posta Korumalı]: ~ $ GREP isimler içinde valentina [E-posta Korumalı]:~$

Bir veya başka bir sembol

Hem PCRE sözdiziminde hem de bir sözdiziminde, bir yazılım kanalı oluşturmanın bir sembolü, bu durumda mantıksal bir işlemi "veya" sunacak. Bu örnekte, ben karakterinin karşılaştığı veya sembolünün bir sembolünün GREP yardımcı programlarıyla arama yapacağız. [E-posta Korumalı]: ~ $ Kedi Listesi Tania Laura [E-posta Korumalı]: ~ $ Grep -e "i | a" listesi Tania Laura

Düzenli ifadelerin (ERE) normal sözdizimini kullanarak bir ifade olarak düzenli ifademizin zorunlu yorumu için PARAMETRE -E GREP yardımcı programlarını kullandığımızı unutmayın.

Bu karakterin bu karakterinin mantıksal bir işlemi "veya" olarak benzer bir yorumlanması için normal ifadelerin (BRE) temel sözdizimini kullanarak düzenli bir ifadede bir yazılım kanalı oluşturmak için bir sembolü korumak zorunda kalacağız. [E-posta Korumalı]: ~ $ Grep -g "i | A" listesi [E-posta Korumalı]: ~ $ Grep -g "i \\ | a" listesi Tania Laura

Bir veya daha fazla tesadüf

* Sembolü, önceki sembolün bir veya daha fazla girişine ve + - sonraki karakter sembolüne karşılık gelir. [E-posta Korumalı]: ~ $ Kedi listesi2 ll lool loool [E-posta Korumalı]: ~ $ Grep -e "o *" list2 ll lol lool loool [E-posta Korumalı]: ~ $ Grep -e "O +" listesi2 lol lool loool [E-posta Korumalı]:~$

Dizenin sonunda tesadüf

Aşağıdaki örneklerde bu dosyayı kullanacağız: [E-posta Korumalı]: ~ $ Kedi İsimleri Tania Laura Valentina Fleur Kat

İki örnekte, hattın sonunda bir tesadüf bulmak için bir dolar simgesi kullanma yöntemidir. [E-posta Korumalı]: ~ $ GREP A $ isimleri Tania Laura Valentina [E-posta Korumalı]: ~ $ GREP R $ isimleri fleur kat

Çizginin başlangıcında tesadüf

Ekle sembolü (^), başlangıçtaki tesadüf (veya ilk karakterlerden) dizesini aramanıza izin verir.

Bu örneklerde yukarıda düşünülen dosya kullanılır. [E-posta Korumalı]: ~ $ Grep ^ val isimleri valentina [E-posta Korumalı]: ~ $ GREP ^ F adları fleur kat

Doların sembolleri ve normal ifadelerde kullanılan ekler, çapa (çapa) denir.

Kelimelerin ayrılması

Aranan kelimelerin GAP sembollerini kullanarak korunması iyi bir çözüm değildir (diğer karakterler, kelime ayırıcı olarak da kullanılabilir). Aşağıdaki örnekte, bir karakter dizisi değil, belirli bir kelimeyle satırları aramak için bir karakter dizisi kullanma yöntemini göstermektedir: [E-posta Korumalı]: ~ $ GREP "\\ BOVER \\ B" Metin Kış bitti. Oraya gelebilir misin? [E-posta Korumalı]:~$

GREP Utility'nin ayrıca arama aramak için tasarlanan -W parametresini de desteklemesini lütfen unutmayın. [E-posta Korumalı]: ~ $ Cat Metin Yönetmen yönetiyor. Kış bitti. Oraya gelebilir misin? [E-posta Korumalı]: ~ $ GREP -W Metin üzerinde kış bitti. Oraya gelebilir misin? [E-posta Korumalı]:~$

Ayarlar Yardımcı Programları GREP.

Bazen, daha karmaşık bir düzenli ifade oluşturmak yerine, GREP yardımcı programının parametreleri ile basit bir düzenli ifadeyi birleştirmesi daha kolaydır. Bu parametreler daha önce tartışıldı: GREP -I GREP -V GREP -W GREP -A5 GREP -B5 GREP -C5

Komut kabuğu tarafından düzenli ifadenin açıklanmasının önlenmesi

Dolar sembolü, hem normal ifade hem de komut kabuğu için özel bir sembolüdür (komut kabuğu değişkenlerini ve gömülü komut kabuklarını hatırlayın). Buna dayanarak, düzenli bir ifadenin taranması, bu ifadenin komut kabuğu tarafından açıklanmasını engellemenizi sağladığından, normal ifadeleri düzenlemeniz önerilir. [E-posta Korumalı]: ~ $ GREP "R $" isimleri Fleur Zemin Yeniden Adlandır

Yardımcı Program yeniden adlandırın.

Yeniden Adlandırma Yardımcı Programının Uygulanması

Linux dağıtımının Talepinde, / USR / Bin / Rename yolu, Perl paketinden yüklenen / USR / BIN / PRENAME senaryosuna bir bağlantıdır. [E-posta Korumalı] ~ $ DPKG -S $ (ReadLink -F $ (Hangi Rename) Perl: / USR / Bin / PRENAME

Kırmızı şapka dağılımına dayanan dağılımlarda, tarif edilen komut dosyasını belirlemek için benzer bir sembolik referans oluşturulmaz (elbette, komut dosyasına elle ayarlanmış bir sembolik bağlantının oluşturulduğu durumlar hariç), bu bölüm tarif edilmeyecektir. dağıtım kırmızı şapkadan yeniden adlandırma.

İnternetteki Rename Yardımcı Programı hakkındaki tartışmalarda, genellikle Debian dağılımında (ve ubuntu, xubuntu, nane, ...) mükemmel şekilde çalışan kararların kırmızı şapka dağılımında kullanılamayacağı gerçeğinden dolayı karışıklık meydana gelir ( Centos, Fedora, ...).

Paketi perl

Rename komutu aslında düzenli perl programlama dillerini kullanarak bir komut dosyası şeklinde uygulanmaktadır. Bu komut dosyasını kullanmak için tam manuel olarak, Perlrequick komutunu girdikten sonra okuyabilirsiniz (Perldoc paketi taktıktan sonra). [E-posta Korumalı]: ~ #ptitude Perl-doc'u yükleyin Aşağıdaki yeni paketler yüklenecektir: Perl-DOC 0 paket güncellendi, 1 yüklü yeni, 0 paketin silinmesi için not edildi ve 0 paket güncellenmiyor. 8,170 KB arşiv almak gerekir. Açmadan sonra 13.2 MB işgal edilecektir. GET: 1 http://mirrordirector.raspbian.org/raspbian/ Wheezy / Main Perl-do ... 8,170 KB 19C'de (412 KB / s) Önceden Seçilmiş Perl-DOC paketi seçin. (Veritabanını okuma ... şu an 67121 dosya ve dizin yüklü.) Perl-doc (dan ... / perl-doc_5.14.2-21 + rpi2_all.deb) ... "/ usr / bin / perldoc / usr / bin / perldoc 'nın / usr / bin / perlodoc. Perl-doc tarafından Stud "İşlenmiş MAN-DB için işlenmiş tetikleyiciler ... Perl-doc paketi yapılandırıldı (5.14.2-21 + RPI2) ... [E-posta Korumalı]: ~ # Perldoc perlrequick

İyi bilinen sözdizimi

Çoğu zaman, Rename Utility, bir dize biçiminde belirli bir şablona karşılık gelen isimler içeren dosyaları aramak ve bu dizgiyi başka bir satıra değiştirir.

Tipik olarak, bu işlem, örnekte gösterildiği gibi normal bir ekspresyon S / string / diğer satır /, aşağıdaki gibi açıklanmaktadır: [E-posta Korumalı] ~ $ Ls abc allfiles.txt bllfiles.txt çizik tennis2.txt abc.conf yedeklemek cllfiles.txt temp.txt tennis.txt [E-posta Korumalı] ~ $ Rename "S / TXT / Metin /" * [E-posta Korumalı] ~ $ Ls abc allfiles.text bllfiles.Text scratch tennis2.Text abc.conf yedeklemek cllfiles.Text temp.text tennis.text

Ve aşağıda, aynı dosyaların uzantılarını tekrar tekrar değiştirmek için Rename Utility'nin iyi bilinen sözdizimini kullanan başka bir örnektir: [E-posta Korumalı] ~ $ Ls abc allfiles.text bllfiles.Text scratch tennis2.Text abc.conf yedeklemek cllfiles.Text temp.text tennis.text [E-posta Korumalı] ~ $ Rename "s / text / txt /" * .Text [E-posta Korumalı] ~ $ Ls abc allfiles.txt bllfiles.txt çizik tennis2.txt abc.conf yedeklemek cllfiles.txt temp.txt tennis.txt [E-posta Korumalı] ~ $

Bu iki örnek, kullandığımız dizelerin yalnızca dosya uzantılarında bulunması nedeniyle uygulanabilir. BASH komut kabuğu ile çalışırken dosya uzantılarının önemli olmadığını unutmayın.

Aşağıdaki örnek, bu sözdizimini kullanırken karşılaşabileceğiniz sorunu göstermektedir. [E-posta Korumalı] ~ $ Touch atxt.txt [E-posta Korumalı] ~ $ Rename "s / txt / problem /" atxt.txt [E-posta Korumalı] ~ $ Ls abc allfiles.txt yedeklemek cllfiles.txt temp.txt tennis.txt abc.conf aproblem.txt bllfiles.txt çizik tennis2.txt [E-posta Korumalı] ~ $

Söz konusu komutu yürütürken, istisnai olarak istenen dizgenin ilk girişinin değiştirilmesi gerçekleştirilir.

Küresel değiştirme

Önceki örnekte kullanılan sözdizimi aşağıdaki gibi tanımlanabilir: değiştirilmesi için / normal ifade / dize /. Bu açıklama basit ve açıktır, çünkü sadece iki ilk çizgi ile son iki slayt arasında değiştirmek için bir satır arasında düzenli bir ifade yerleştirmeniz gerekir.

Aşağıdaki örnekte, bu sözdizimi değiştiricinin eklenmesi nedeniyle hafifçe genişletilir. [E-posta Korumalı] ~ $ Rename -n "s / txt / txt / g" atxt.txt atxt.txt atxt.txt olarak yeniden adlandırıldı [E-posta Korumalı] ~ $

Şimdi kullandığımız sözdizimi, değiştirici S'nin değiştirme işlemi (anahtar) olduğu ve G değiştiricinin uygulanması gerektiğini bildirdiği, değiştirme / g için S / Düzenli İfade / Dize olarak tanımlanabilir. küresel değiştirme (Global).

Bu örnekte, -N parametresinin gerçekleştirilen işlemle ilgili bilgileri görüntülemek için kullanıldığını unutmayın (işlemin kendisini yerine getirmek yerine, dosyayı doğrudan yenilemek yerine).

Kayıt olmadan değiştirme

Yararlı olabilecek başka bir değiştirici, bir değiştirici I. Aşağıdaki örnek, dizeyi kayıt defterini kaydetmeden başka bir satıra değiştirme yöntemini göstermektedir. [E-posta Korumalı]: ~ / Dosyalar $ ls file1.text file2.Text file3.txt [E-posta Korumalı]: ~ / Dosyalar $ Rename "S / .Text / .txt / i" * * [E-posta Korumalı]: ~ / Dosyalar $ ls file1.txt file2.txt file3.txt [E-posta Korumalı]: ~ / Dosyalar $

Uzantıları değiştirme

Takım arayüzü linux dizeleri İşletim sisteminde geçerli olan MS-DOS'a benzer bir dosya uzantısı hakkında hiçbir fikri yoktur, ancak grafiksel bir arayüze sahip birçok kullanıcı ve uygulama bunları kullanır.

Bu bölüm, yalnızca dosya uzantılarını değiştirmek için yeniden adlandırma yardımcı programını kullanma örneği sağlar. Örnek, değiştirme için referans noktasının dosya adının sonu olduğunu belirtmek için dolar sembolünü kullanır. [E-posta Korumalı] ~ $ Ls * .txt allfiles.txt bllfiles.txt cllfiles.txt really.txt.txt temp.txt tennis.txt [E-posta Korumalı] ~ $ Rename "s / .txt $ /. Txt /" * .txt [E-posta Korumalı] ~ $ Ls * .txt allfiles.txt bllfiles.txt cllfiles.txt really.txt.txt temp.txt tennis.txt [E-posta Korumalı] ~ $

Normal ifade içindeki dolar sembolünün çizginin sonunu gösterdiğini unutmayın. Dolar sembolü olmadan, bu komutun yürütülmesi, Gerçek.txt.txt dosyasının adını işleme sırasında tamamlanmalıdır.

SED yardımcı programı

Veri Akışı Düzenleyicisi

Veri akışı düzenleyicisi (akış düzenleyicisi) veya kısalık için, SED yardımcı programı veri akışını değiştirmek için düzenli ifadeler kullanır.

Bu örnekte, SED yardımcı programı dizeyi değiştirmek için kullanılır. Echo Pazartesi | SED "S / Monon / sn /" Salı günü

Slash, bazı durumlarda daha uygun ve geliştirilmiş ekip okunabilirliği olabilecek diğer bazı karakterlerle değiştirilebilir. Echo Pazartesi | SED "S: Pazartesi: İkincisi:" Salı Echo Pazartesi | SED "S_-region_vtor_" Salı Echo Pazartesi | Sed "s | pazartesi | sıçan |" Salı

Etkileşimli Editör

SED yardımcı programının veri akışlarını işlemek için tasarlanmasına rağmen, etkileşimli dosya işleme için de kullanılabilir. [E-posta Korumalı]: ~ / Dosya $ echo Pazartesi\u003e Bugün [E-posta Korumalı]: ~ / Dosya $ Cat Bugün Pazartesi [E-posta Korumalı]: ~ / Dosya $ SED -I "S / Pazartesi / Dev /" Bugün [E-posta Korumalı]: ~ / Dosya $ Cat Bugün Salı günü

Amper ve sembolü, istenen (ve bulundu) dizgiyi ifade etmek için kullanılabilir.

Bu örnekte, Amper ve bulunan satır sayısını iki katına çıkarmak için kullanılır. Echo Pazartesi | SED "S / Monda / && /" Pazartesi Echo Pazartesi | SED "S / NIK / && /" Pazartesi

Yuvarlak parantezler, daha sonra bağlantıları yüklenebilecek normal bir ifadenin parçalarını gruplandırmak için kullanılır.

Aşağıdaki örneği düşünün: [E-posta Korumalı]: ~ $ Echo Pazar | SED "S \\ (Sun \\) _ \\ 1ny_" Sunnyday [E-posta Korumalı]: ~ $ Echo Pazar | SED "S \\ (Sun \\) _ \\ 1ny \\ 1_" Sunny Pazar

Herhangi bir sembolü gösterme noktası

Düzenli ifadede, basit bir nokta sembolü herhangi bir karakter tasarlayabilir. [E-posta Korumalı]: ~ $ ECHO 2014-04-01 | SED "S / N0-..-../ YYYY-MM-DD /" YYYY-MM-DD [E-posta Korumalı]: ~ $ Echo abcd-ef-gh | SED "S / N0-..-../ YYYY-MM-DD /" YYYY-MM-DD

Birden fazla yuvarlak parantez içindeki durumlarda, her birine referans, ardışık sayısal değerler kullanılarak gerçekleştirilebilir. [E-posta Korumalı]: ~ $ ECHO 2014-04-01 | SED "S / \\ (.... \\) - \\ (. \\) - \\ (.. \\) / \\ 1+ \\ 2+ \\ 3 /" 2014 + 04 + 01 [E-posta Korumalı]: ~ $ ECHO 2014-04-01 | SED "S / \\ (.... \\) - \\ (. \\) - \\ (. \\) / \\ 3: \\ 2: \\ 1 /" 01: 04: 2014

Bu özelliğin gruplandırma denir.

Uzay

Sembol sekansı, bir alan veya sekme sembolü olarak böyle bir sembole atıfta bulunmak için kullanılabilir.

Bu örnek, 1 uzay aracı ile değiştirilen GAP sembollerinin (\\ s) küresel bir sekans sekansını sağlar. [E-posta Korumalı]: ~ $ echo -e "bugün \\ tiyatar \\ td" bugün sıcak bir gün [E-posta Korumalı]: ~ $ echo -e "bugün \\ ticaret \\ tdn" | SED "S_ \\ S_ _G" Bugün sıcak bir gün

İsteğe bağlı girişler

Soru işareti sembolü, önceki sembolün isteğe bağlı olduğunu gösterir.

Aşağıdaki örnekte, o üç karakter dizisi arıyor ve üçüncü karakter O isteğe bağlıdır. [E-posta Korumalı]: ~ $ Kedi listesi2 ll lool loool [E-posta Korumalı]: ~ $ Grep -e "OOO?" List2 Lool Loool. [E-posta Korumalı]: ~ $ Cat List2 | SED "S / OOO \\? / A /" ll ll lal lal

Tam olarak n tekrarlar

Önceki sembolün tam tekrarını belirleyebilirsiniz.

Bu örnek, tam olarak üç sembolle olan satırları arıyor. [E-posta Korumalı]: ~ $ Kedi listesi2 ll lool loool [E-posta Korumalı]: ~ $ Grep -e "o (3)" liste2 loool [E-posta Korumalı]: ~ $ Cat List2 | SED "S / O \\ (3 \\) / a /" ll lol lool lal [E-posta Korumalı]:~$

N ila m tekrarlama

Ve bu örnekte, sembolün minimumdan (2) maksimum (3) zamana kadar tekrarlanması gerektiğini açıkça belirtiyoruz. [E-posta Korumalı]: ~ $ Kedi listesi2 ll lool loool [E-posta Korumalı]: ~ $ Grep -e "O (2.3)" liste2 lool loool [E-posta Korumalı]: ~ $ GREP "O \\ (2.3 \\)" List2 Lool Loool [E-posta Korumalı]: ~ $ Cat List2 | SED "S / O \\ (2.3 \\) / A /" ll lol lal lal [E-posta Korumalı]:~$

Bash komutu kabuğu geçmişi

Bash komut kabuğu, bazı düzenli ifadeleri de yorumlayabilir.

Bu örnek, bash komutu kabuğu geçmişindeki bir arama maskesinin parçası olarak ünlem işareti olan bir manipülasyon tekniğini göstermektedir. [E-posta Korumalı]: ~ $ Mkdir hist [E-posta Korumalı]: ~ $ CD HIST / [E-posta Korumalı]: ~ / Hel $ touch file1 file2 file3 [E-posta Korumalı]: ~ / Hel $ ls -L file1 -rw-r - r - 1 Paul Paul 0 Nis 15 22:07 Dosya1 [E-posta Korumalı]: ~ / Hist $! L ls -l file1 -rw-r - r - 1 Paul Paul 0 Nis 15 22:07 Dosya1 [E-posta Korumalı]: ~ / Hist $! L: S / 1/3 LS -L File3 -RW-R - R - 1 Paul Paul 0 Nis 15 22:07 Dosya3 [E-posta Korumalı]: ~ / Hel $ $

Bu teknik, BASH komut kabuğu komutunun geçmişini okurken sayıların kullanımı durumunda da çalışır. [E-posta Korumalı]: ~ / Hist $ Tarih 6 2089 Mkdir Hist 2090 CD Hist / 2091 Dokunmatik File1 File2 File3 2092 LS -L File1 2093 LS -L File3 2094 Tarihçe 6 [E-posta Korumalı]: ~ / Hel! 2092 ls -l file1 -rw-r - r - 1 Paul Paul 0 Nis 15 22:07 Dosya1 [E-posta Korumalı]: ~ / Hel! 2092: S / 1/2 LS -L File2 -RW-R - R - 1 Paul Paul 0 Nis 15 22:07 Dosya2 [E-posta Korumalı]: ~ / Hel $ $

SED ve awk kullanarak Bash-Scripts'deki metinleri tamamen işlemek için, normal ifadelerle uğraşmak sadece gereklidir. Bu faydalı aracın uygulanması tam anlamıyla her yerde bulunabilir ve tüm düzenli ifadeler kullanılmasına rağmen, aynı fikirlere dayanarak, bunlarla çalışın farklı ortamlarda belirli özelliklere sahiptir. Burada senaryolarda kullanım için uygun normal ifadeler hakkında konuşacağız. komut satırı Linux.

Bu malzeme, ne olduğunu kesinlikle bilemeyenler için tasarlanmış normal ifadelere bir giriş olarak tasarlanmıştır. Bu nedenle, en başından başlayın.

Düzenli ifadeler nedir

Birçok kişi için, ilk önce düzenli ifadeleri gördüklerinde, fikir hemen anlamsız bir karakter dergisi olmadığı ortaya çıkıyor. Ancak bu, elbette uzak. Örneğin, bu düzenli ifadede bir göz atın.


Bize göre, mutlak bir acemi bile, nasıl çalıştığını ve neden gerekli olduğunu anlayacaktır :) Anlamıyorsanız, sadece daha fazla okuyun ve her şey yer alacak.
Düzenli ifade, SED veya AWK filtre metinleri gibi programları kullanan bir şablondur. Şablonlarda, kendilerini temsil eden geleneksel ASCII karakterleri ve sözde metaSimlistler, örneğin, bazı karakter gruplarını ifade etmenize izin veren özel bir rol oynayan metasimlistler.

Düzenli İfadelerin Türleri

Örneğin, çeşitli ortamlarda düzenli ifadelerin uygulanması, örneğin Java, Perl ve Python gibi dillerde, SED, AWK ve GREP gibi Linux araçlarında, belirli özelliklere sahiptir. Bu özellikler, şablonların yorumlanmasıyla meşgul olan böylelikli motor işleme motorlarına bağlıdır.
Linux iki normal ifade motoruna sahiptir:
  • POSIX Temel Düzenli İfade (BRE) standardını destekleyen motor.
  • POSIX'i destekleyen motor, normal ifade (ERE) standardını uzattı.
Çoğu Linux yardımcı programı en azından standart POSIX BRE'ye karşılık gelir, ancak bazı yardımcı programlar (aralarında - SED) yalnızca BRE standardının belirli bir alt kümesini anlar. Böyle bir kısıtlamanın nedenlerinden biri, bu tür yardımcı programları metin işlemede mümkün olduğunca çabuk yapma arzusudur.

POSIX ERE standardı genellikle programlama dillerinde uygulanır. Düzenli ifadeler geliştirirken çok sayıda fon kullanmanızı sağlar. Örneğin, metinde arama gibi, sık kullanılan desenler için özel karakterler sekansları olabilir. kelimeleri ayırmak veya rakam kümeleri. AWK, ERE standardını destekler.

Programcının görüşüne bağlı olarak düzenli ifadeler geliştirmenin ve bunlar tarafından yaratılan motorun özelliklerine ilişkin birçok yol vardır. Herhangi bir motoru anlayabilen evrensel düzenli ifadeler yazmak kolay değildir. Bu nedenle, en sık kullanılan düzenli ifadelere odaklanacağız ve SED ve AWK için uygulamalarının özelliklerini göz önünde bulunduracağız.

Düzenli ifadeler POSIX BRE

Belki de en basit BRE şablonu, metindeki sembollerin doğru sırasını aramak için düzenli bir ifadedir. İşte sed ve awk dize aramanın ne gibi görünüyor:

$ Echo "Bu bir test" | SED -N "/ TEST / P" $ ECHO "Bu bir Test" | AWK "/ Test / (0 $)"

SED Şablona Göre Metin Ara


Metin Arama Şablona Göre Awk

Belirli bir şablon aramanının, dizideki metnin tam yerini dikkate almadan gerçekleştirileceği belirtilebilir. Ek olarak, olayların sayısı önemli değil. Düzenli ifade, belirtilen metni dizenin herhangi bir yerinde bulduktan sonra, dize daha fazla işleme için uygun ve iletilir.

Düzenli ifadelerle çalışmak, karakter kayıtlarına duyarlı oldukları dikkate alınmalıdır:

$ Echo "Bu bir test" | AWK "/ Test / (0 $)" $ echo "Bu bir test" | AWK "/ Test / (0 $)"

Düzenli ifadeler kaydolmaya duyarlıdır

İlk tesadüflerin ilk düzenli ifadesi bulamadı, çünkü "Test" kelimesi, büyük harfle başlayarak, metinde gerçekleşmez. Büyük harflerle yazılan kelimeyi aramak için yapılandırılan ikinci, akışta uygun bir dize buldu.

Düzenli ifadelerde, sadece harflerle değil, aynı zamanda boşluklar ve sayılar da mümkündür:

$ Echo "Bu bir Test 2" | AWK "/ Test 2 / (0 $)"

Boşlukları ve sayıları içeren bir metin parçasını arayın

Boşluklar normal ifadelerin motoru tarafından sıradan karakterler olarak algılanır.

Özel semboller

Düzenli ifadelerde çeşitli semboller kullanırken, bazı özellikler dikkate alınmalıdır. Öyleyse, bazı özel semboller veya metacharacters, kullanımı şablonda özel bir yaklaşım gerektirir. İşte buradalar:

.*^${}\+?|()
Eğer bunlardan biri şablonda ihtiyaç duyulursa, ters bir örgü (ters eğik çizgi) - \\ ile korunması gerekir.

Örneğin, bir dolar işareti bulmanız için gereken metin ise, tarama sembolünden sonra şablonda açılmalıdır. Diyelim ki, bu tür bir metin içeren bir MyFile dosyası var:

Cebimde 10 dolar var
Dolar işareti böyle bir şablon kullanılarak tespit edilebilir:

$ AWK "/ \\ $ / (0 $)" MyFile

Özel bir sembol şablonunda kullanın

Ek olarak, ters batan hattı da özel bir semboldür, bu nedenle şablonda kullanmanız gerekirse, ayrıca korumalı olması gerekir. İki eğik çizgi gibi görünüyor, birbirlerine gidiyor:

$ Echo "\\ özel bir karakterdir" | AWK "/ \\\\ / (0 $)"

Koruyucu ters eğik çizgi

Doğrudan eğik çizgi yukarıdaki özel karakterler listesine dahil olmamasına rağmen, onları SED veya AWK için yazılı düzenli ifadelerde kullanma girişimi hata ile sonuçlanacaktır:

$ Echo "3/2" | AWK "/// $ 0 $)"

Şablondaki Doğrudan Slash'in Yanlış Kullanımı

Gerekirse, bu da korunmalıdır:

$ Echo "3/2" | AWK "/ \\ // (0 $)"

Koruyucu Doğrudan Slash

Çapa sembolleri

Şablonu başlangıcına veya metin dizesinin sonuna kadar bağlamak için iki özel karakter vardır. "Kapak" sembolü - ^ Metin dizelerinin başında olan karakterlerin dizilerini tanımlamanızı sağlar. İstenen desen dizenin başka bir yerinde ise, normal ifade buna cevap vermez. Bunun gibi bu sembol gibi görünüyor:

$ Echo "Ablegeeks web sitesine hoş geldiniz" | AWK "/ ^ likegeeks / (0 $)" $ echo "likegeeks web sitesi" | Awk "/ ^ maugeeks / (0 $)"

Çizginin başlangıcında şablon arama

^ Sembolü, çizginin başında bir şablonu aramak için tasarlanmıştır, karakter kayıtları da dikkate alınır. Böyle, bunun işlemi nasıl etkilediğini görelim. metin dosyası:

$ Awk "/ ^ Bu / (0 $)" MyFile


Dosyadaki metindeki satırın başında şablon arama

SED kullanırken, kapağı şablonun içindeki herhangi bir yere yerleştirirseniz, başka herhangi bir geleneksel sembol olarak algılanır:

$ Echo "Bu ^ bir test" | SED -N "/ s ^ / p"

SED şablonun başında olmayan kapak

AWK'da, aynı şablonu kullanırken, bu karakter korumalı olmalıdır:

$ Echo "Bu ^ bir test" | AWK "/ s \\ ^ / (0 $)"

Şablonun başında olmayan kapak, awk

Metin parçaları arayışı ile, çizginin başında çözdük. Ya çizginin sonunda bir şeyler bulmanız gerekirse?

Bu bize bir dolar işareti - bir çapa ipi uç simgesi olan bir dolar işareti - yardımcı olacaktır:

$ Echo "Bu bir test" | AWK "/ TEST $ / (0 $)"

Dize sonunda metin arama

Aynı şablonda her iki çapa sembolünü de kullanabilirsiniz. MyFile dosyasının işlenmesini, içerikleri aşağıdaki şekilde gösterilen, böyle bir normal ifadeyi kullanarak göstereceğiz:

$ Awk "/ ^ Bu bir test $ / (0 $)" MyFile


Özel başlangıç \u200b\u200bve bitiş sembollerinin kullanıldığı şablon

Görülebileceği gibi, şablon sadece tam olarak uygun bir dize üzerinde reaksiyona sokuldu belirtilen dizilim karakterler ve konumları.

İşte, çapa sembolleri kullanarak, boş hatları filtreleyin:

$ AWK "! / ^ $ / (0 $)" MyFile
Bu şablonda, bir ünlem işareti -! . Böyle bir şablonun kullanılmasıyla, hattın başlangıcı ve sonu arasında hiçbir şey içermeyen satırlar için bir arama vardır ve ünlem işareti Sadece bu şablona karşılık gelmeyen çizgiler görüntülenir.

"Nokta" sembolü

Puan, satır çeviri sembolü hariç, herhangi bir tek sembolü aramak için kullanılır. İçeriği aşağıda gösterilen şekilde böyle bir düzenli ifade vermeyiz MyFile dosyası verelim:

$ Awk "/.st/(print $ 0)" MyFile


Düzenli ifadelerde bir nokta kullanarak

Görüntülenen verilere göre görülebileceği gibi, şablon sadece bir "ST" karakterleri dizisi içeren, başka bir sembolle taklit edilen bir dizi "ST" karakterleri içerdiğinde, uygun dizinin üçüncü satırı içermez ve dördüncesinde, ancak hattın başlangıcında.

Sembol sınıfları

Nokta herhangi bir tek sembole karşılık gelir, ancak istenen karakter kümesini daha esnek bir şekilde sınırlamanız gerekirse? Böyle bir durumda, karakter sınıflarını kullanabilirsiniz.

Bu yaklaşım sayesinde, belirtilen setten herhangi bir karakter aramasını düzenleyebilirsiniz. Kare parantez karakter sınıfını tanımlamak için kullanılır -:

$ Awk "/ th / (0 $)" MyFile


Düzenli olarak karakter sınıfının açıklaması

Burada, "th" karakterlerinin sırasını arıyoruz, önünde "o" sembolü veya "I" sembolü olan bir sembolü var.

Sınıflar hem sermayeden hem de küçük harflerden başlayabilecek kelimeler arayışı yapılırsa, sınıflar çok misafirperver:

$ Echo "Bu bir test" | AWK "/ HIS bir test / (0 $)" $ echo "Bu bir test" | AWK "/ HIS bir test / (0 $)"

Küçük harf veya büyük harfle başlayabilecek kelimeleri bulmak

Karakter sınıfları harflerle sınırlı değildir. Burada diğer karakterleri kullanabilirsiniz. Önceden söylemek imkansız, hangi durum sınıflarının ihtiyaç duyacağını, hepsi çözülmekte olan göreve bağlıdır.

Sembol sınıflarının reddedilmesi

Karakter sınıfları, yukarıda açıklanan görevi çözmek için de kullanılabilir. Yani, sınıfta yer alan karakterleri bulmak yerine, sınıfa dahil olmayan her şeyi aramayı düzenleyebilirsiniz. Düzenli bir ifadenin böyle bir davranışını elde etmek için, sınıf karakterlerinin listesinden önce bir işaret yerleştirmeniz gerekir ^. Buna benziyor:

$ Awk "/ [^ oi] th / (0 $)" MyFile


Sınıfa dahil olmayan sembolleri arayın

Bu durumda, "inci" karakterlerinin sekansları, daha önce "O", ne de "i" yoktur.

Sembol bantları

Sembolik sınıflarda, bir çizgi kullanarak karakter aralıklarını tanımlayabilirsiniz:

$ AWK "/ st / (0 $)" MyFile


Sembolik sınıftaki sembol aralığının açıklaması

Bu örnekte, normal ifade, "St" sembollerinin dizisine, önündeki "E" ve "P" karakterleri arasında, alfabetik sıraya göre herhangi bir sembol bulunduğunu öne cevap verir.

Aralıklar sayılardan oluşturulabilir:

$ Echo "123" | awk "//" $ echo "12A" | AWK "//"

Üç numarayı aramak için düzenli ifade

Sembol sınıfı birkaç aralık içerebilir:

$ AWK "/ st / (0 $)" MyFile


Birkaç çeşitten oluşan sembol sınıfı

Bu düzenli ifade, önündeki tüm "ST" dizilerini, önündeki A-F ve M-Z bantlarının sembolleri olduğunu bulacaktır.

Sembollerin özel sınıfları

BRE, düzenli ifadeler yazarken kullanılabilecek özel karakter sınıflarına sahiptir:
  • [[: Alfa:]] - üst veya alt kayıtta kaydedilen alfabetik sembollere karşılık gelir.
  • [[: Alnum:]] - Herhangi bir alfanümerik sembole karşılık gelir, yani 0-9, A-Z, A-Z arasındaki semboller.
  • [[: Boş:]] - sekmenin boşluğuna ve sekmesine karşılık gelir.
  • [[: Basamak:]] - 0 - 9 arasında herhangi bir dijital sembol.
  • [[: Yukarı:]] - Büyük harf - A-Z'de alfabetik karakterler.
  • [[: Alt:]] - Alt harflerdeki alfabetik karakterler - A-Z.
  • [[: Baskı:]] - Herhangi bir yazdırılan sembole karşılık gelir.
  • [[: Punct:]] - Noktalama işaretlerine karşılık gelir.
  • [[: Space:]] - Kör karakterler, özellikle boşluk, sekme işareti, semboller nl, ff, vt, cr.
Bunun gibi şablonlarda özel sınıflar kullanın:

$ Echo "ABC" | AWK "/ [[: alfa:]] / (0 $)" $ echo "ABC" | AWK "/ [[: digit:]]] / (0 $)" $ echo "ABC123" | AWK "/ [[: basamak:]] / (0 $)"


Düzenli ifadelerde sembollerin özel sınıfları

"Yıldız" sembolü

Sembolden sonra şablonda, Yıldızı koyun, bu, hattın eksik olan karakterin eksik olduğunda, herhangi bir sayı dahilinde sembol herhangi bir sayıda görünürse normal ifadenin çalışacağı anlamına gelecektir.

$ Echo "Test" | AWK "/ TES * T / (0 $)" $ echo "Tessst" | AWK "/ TES * T / (0 $)"


Düzenli ifadelerde bir sembol * kullanma

Bu şablon sembolü genellikle yazım hataları veya yazım için farklı seçeneklere izin veren kelimeler için kullanılan kelimelerle çalışmak için kullanılır:

$ Echo "Yeşil renk seviyorum" | AWK "/ colou * r / (0 $)" $ echo "Yeşil renk seviyorum" | AWK "/ colou * r / (0 $)"

Farklı yazma seçeneklerine sahip olan kelimeleri arayın

Bu örnekte, aynı düzenli ifade "renk" kelimesine ve "renk" kelimesine tepki verir. Bu yüzden, "U" sembolünün, ardından yıldızların durduğu, daha sonra bir ardında birkaç kez olmayabilir veya oluşabileceği sayesinde.

Yıldız sembolünün özelliklerinden kaynaklanan bir başka yararlı fırsat, bir noktayla birleştirmektir. Böyle bir kombinasyon, normal ifadenin herhangi bir karaktere cevap vermesini sağlar:

$ Awk "/this.*test/(print $ 0)" MyFile


Herhangi bir karakterden herhangi bir numaraya tepki veren şablon

Bu durumda, "bu" ve "Test" kelimeleri arasında kaç karakter olduğun önemli değil.

Yıldızlar sembol sınıflarıyla kullanılabilir:

$ Echo "St" | AWK "/ s * t / (0 $)" $ echo "Sat" | AWK "/ s * t / (0 $)" $ echo "set" | AWK "/ s * t / (0 $)"


Sembol sınıfları ile yıldız kullanma

Her üç örnekte, normal ifade tetiklenir, çünkü karakter sınıfının ardından yıldızlar, herhangi bir sayıda karakter "A" veya "E" bulunursa ve eğer bulunamıyorsa, dize belirtilen şablonla eşleşecektir.

Düzenli POSIX ERE İfadeleri

Şablonlar posix standardı Bazı Linux yardımcı programlarını destekleyen ek karakterler içerebilir. Daha önce de belirtildiği gibi, AWK bu standardı destekler, ancak SED değil.

Burada kendi düzenli ifadelerinizi oluştururken sizin için yararlı olacak en sık kullanılan sembollere bakacağız.

▍Shisant işareti

Soru işareti, önceki sembolün bir kez metinde bir kez buluşabileceğini veya hiç karşılaşmamasını gösteriyor. Bu sembol, tekrarların metaSimvol'lerinden biridir. İşte bazı örnekler:

$ Echo "tet" | AWK "/ TES? T / (0 $)" $ echo "Test" | AWK "/ TES? T / (0 $ Baskı)" $ echo "TESST" | AWK "/ TES? T / (0 $)"


Düzenli ifadelerde soru işareti

Görülebileceği gibi, üçüncü durumda, "S" harfi iki kez toplanır, bu nedenle "TESST" kelimesi normal ifade cevap vermez.

Soru işareti sembol sınıfları ile kullanılabilir:

$ Echo "tst" | AWK "/ t? ST / (0 $)" $ echo "Test" | AWK "/ t? St / (0 $)" $ echo "TAST" | AWK "/ t? ST / (0 $)" $ echo "Taest" | AWK "/ t? St / (0 $)" $ echo "teest" | AWK "/ t? ST / (0 $)"


Soru işareti ve sembol sınıfları

Bir sınıftan arka arkaya bir karakter yoksa veya bunlardan biri bir kez gerçekleşmezse, normal ifade tetiklenir, ancak kelimede iki karakter görünmesi gerekir ve sistem artık metin eşleşen metinde bulamaz.

▍Simol "Plus"

Şablondaki artı sembolü, önceki sembolün metinde bir veya daha fazla kez buluşacağını, normal ifadenin istenen birini algılayacağını gösterir. Aynı zamanda, bir sembolün yokluğunda böyle bir tasarım olmayacak:

$ Echo "Test" | AWK "/ TE + ST / (0 $)" $ echo "teest" | AWK "/ TE + ST / (0 $)" $ ECHO "TST" | AWK "/ TE + ST / (0 $)"


Düzenli ifadelerde "artı" sembolü

Bu örnekte, kelimedeki "E" sembolü yoksa, düzenli ifadelerin motoru metni eşleşen metinde şablonu bulamıyor. "Plus" ın sembolü ve sembollerin sınıfları ile birlikte - bu etiket ve soru işaretine benzer:

$ Echo "tst" | AWK "/ T + ST / (0 $)" $ echo "Test" | AWK "/ T + ST / (0 $)" $ ECHO "TAMAM" | AWK "/ T + ST / (0 $)" $ echo "Teeast" | AWK "/ T + ST / (0 $)"


Artı işareti ve sembol sınıfları

Bu durumda, sınıftan herhangi bir karakter varsa, metin uygun desen tarafından tespit edilecektir.

▍Figure Braketleri

ERE şablonlarında kullanılabilecek şekil braketleri yukarıda tartışılan sembollere benzer, ancak daha önce sembolün gerekli sayıda girişlerini daha doğru bir şekilde ayarlamanıza izin verir. Kısıtlamayı iki formatta belirleyebilirsiniz:
  • n, istenen giriş sayısını belirleyen bir sayıdır.
  • n, m - aşağıdaki gibi yorumlanan iki sayı: "En az n kez, ancak M'den fazla değil"
İşte ilk seçeneğin örnekleri:

$ Echo "tst" | AWK "/ TE (1) ST / (0 $)" $ echo "Test" | AWK "/ TE (1) ST / (0 $)"

Şablonlardaki figürlü parantezler, kesinlik sayısını arayın

AWK'nın eski sürümlerinde, programın düzenli ifadelerdeki aralıkları tanımak için komut satırı anahtar - aralığını kullanmak gerekliydi, ancak bunu yeni sürümlerde yapmak gerekli değildir.

$ Echo "tst" | AWK "/ TE (1,2) st / (0 $)" $ echo "Test" | AWK "/ TE (1,2) st / (0 $)" $ echo "Teest" | AWK "/ TE (1,2) st / (0 $)" $ echo "Teest" | AWK "/ TE (1,2) ST / (0 $)"


Macoba aralığı

Bu örnekte, "E" sembolü 1 veya 2 kez bir dizgeyle buluşmalıdır, daha sonra normal ifade metne yanıt verecektir.

Figürlü braketler, sembol sınıflarıyla kullanılabilir. İşte size zaten ilkeler için tanıdık:

$ Echo "tst" | AWK "/ T (1,2) ST / (0 $)" $ echo "Test" | AWK "/ T (1,2) ST / (0 $)" $ echo "Teest" | AWK "/ T (1,2) ST / (0 $)" $ echo "TEEAST" | AWK "/ t (1,2) ST / (0 $)"


Büyük parantez ve sembol sınıfları

Şablon, "A" sembolünü veya "E" sembolünü karşılayacaksa metne cevap verecektir.

▍Mimvivo mantıksal "veya"

Sembol | - Dikey özellik, normal ifadelerde mantıksal bir "veya" anlamına gelir. Böyle bir işaretle ayrılmış birkaç fragman içeren düzenli bir ifadeyi işleme, motor, herhangi bir parçanın herhangi birine karşılık geleceği durumunda, analiz edilen metni dikkate alacaktır. İşte bir örnek:

$ Echo "Bu bir test" | AWK "/ Test | Sınav / (0 $)" $ echo "Bu bir sınav" | AWK "/ Test | Sınav / (0 $ Baskı)" $ echo "Bu başka bir şey" | AWK "/ Test | Sınav / (0 $ Baskı)"


Mantıksal "veya" Düzenli ifadelerde

Bu örnekte, "Test" veya "Sınav" kelimelerinin metninde arama yapmak için düzenli bir ifade yapılandırılmıştır. Lütfen şablon parçaları ile paylaşım sembolü arasında dikkat edin | Boşluk olmamalıdır.

Düzenli ifadelerin parçaları yuvarlak parantez kullanılarak gruplandırılabilir. Belirli bir karakter dizisi gruplandırılırsa, sistem tarafından normal bir sembol olarak algılanır. Yani, örneğin, tekrarların metaçolarını uygulamak mümkün olacaktır. İşte böyle görünüyor:

$ Echo "Beğen" | AWK "/ Gibi (Geeks)? / (Yazdır 0 $)" $ echo "likegeeks" | AWK "/ Gibi (Geeks)? / (0 $ Baskı)"


Düzenli ifadelerin gruplandırılması

Bu örneklerde, "Geeks" kelimesi yuvarlak parantez içine alınır, bu tasarımdan sonra bir soru işareti var. Soru işaretinin "0 veya 1 tekrarı" anlamına geldiğini hatırlayın, sonuç olarak, normal ifade "benzeri" dizgiye ve AbleGeeks String'e tepki verir.

Pratik örnekler

Düzenli ifadelerin temellerini söküldükten sonra, onlarıyla yararlı bir şey yapma zamanı.

▍ Dosya sayısı

Kaydedilen dizinlerde dosyaları sayan bir bash betiği yazın. değişken ortam Yol. Bunu yapmak için, başlamanız gerekir, dizinlere yönelik bir yollar listesi oluşturmanız gerekir. SED ile yapalım, kolonu boşluklarda değiştirerek:

$ Echo $ yolu | SED "s /: / / g"
Değiştirici komut, metni aramak için düzenli ifadeleri destekler. Bu durumda, her şey son derece basittir, bir kolon sembolü arıyoruz, ancak kimse burada ve başka bir şey kullanmak için rahatsız edici değil - hepsi belirli bir göreve bağlıdır.
Şimdi, döngüde alınan listeden geçmeniz ve hesaplama için gerekli eylem dosyalarının sayısını gerçekleştirmeniz gerekir. Genel Komut Dosyası Programı böyle olacak:

MyPath \u003d $ (echo $ yol | SED "S /: / / G") $ MyPath Dinle
Şimdi, dizinin her birindeki dosya sayısı hakkında bilgi almak için LS komutunu kullanarak komut dosyasının tam metnini yazın:

#! / bin / bash MyPath \u003d $ (yankı $ yolu | SED "S /: / / g") sayım \u003d 0 $ MyPath do check do check \u003d $ (ls $ dizin), $ check do count \u003d $ [$ Sayım + 1] YAPILAN ECHO "$ Dizin - $ COUNT" COUNT \u003d 0
Komut dosyasını başlattığınızda, yoldan gelen bazı dizinlerin mevcut olmadığı ortaya çıkabilir, ancak mevcut yönetmenlerde dosyaları hesaplamasını engellemez.


Dosyaları sayma

Bu örneğin ana değeri, aynı yaklaşımı kullanarak, çok daha karmaşık görevleri çözebilirsiniz. Tam olarak - ihtiyaçlarınıza bağlıdır.

▍ E-posta adreslerini kontrol edin

Adresleri kontrol etmenize izin veren, düzenli ifadelerin büyük koleksiyonlarına sahip web siteleri var. e-posta, telefon numaraları vb. Ancak, bir şey hazırlamak ve başka bir başkası - kendiniz yaratın. Bu nedenle, e-posta adreslerini kontrol etmek için düzenli bir ifade yazın. Kaynak verilerin analiziyle başlayalım. Burada, örneğin, belirli bir adres:

[E-posta Korumalı]
Kullanıcı adı, kullanıcı adı, alfasayısal ve diğer bazı karakterlerden oluşabilir. Yani, bir nokta, çizgi, yapışmanın bir sembolü, artı işaretidir. Kullanıcı adının arkasında @ imzalamalı.

Bu bilgilerle silahlı olan, kullanıcı adını kontrol etmeye hizmet eden sol kısmından düzenli bir ifadeyi monte etmeye başlayalım. Yaptığımız şey budur:

^(+)@
Bu düzenli ifade aşağıdaki gibi bulunabilir: "Satırın başında, köşeli parantez içinde belirtilen grupta en az bir karakter olmalı ve sonra @ işareti gitmeli.

Şimdi - ana bilgisayar adının adı - ana bilgisayar adı. Aynı kurallar burada kullanıcı adı olarak uygulanabilir, bu nedenle bunun için şablon şöyle görünecektir:

(+)
alan adı Üst düzey özel kurallara uyun. Sadece en az iki olması gereken alfabetik karakterler olabilir (örneğin, bu alanlar genellikle ülke kodunu içerir) ve beşten fazla olmaz. Bütün bunlar, adresin son bölümünü kontrol etmek için şablonun şudur:

\.({2,5})$
Bunu şöyle okuyabilirsin: "Önce bir nokta, sonra - 2 ila 5 alfabetik karakterden sonra ve ondan sonra hat bitiyor."

Düzenli bir ifadenin bireysel parçaları için şablonları hazırlayın, bunları bir araya getiriyoruz:

^(+)@(+)\.({2,5})$
Şimdi sadece ne olduğunu test etmek için kalır:

$ echo " [E-posta Korumalı]"| AWK" / ^ (+) @ (+) \\. ((2,5) $$ / (0 $) "$ echo" [E-posta Korumalı]"| AWK" / ^ (+) @ (+) \\. ((2,5) $ 0) "/ (0 $)"


Normal ifadeleri kullanarak e-posta adresini kontrol edin

İletilen AWK metninin ekranda görüntülenmesi, sistemin içindeki e-posta adresini tanıdığı anlamına gelir.

SONUÇLAR

Makalenin başlangıcında karşılanan e-posta adreslerini kontrol etmek için düzenli bir ifade ise, umarım tamamen anlaşılmaz görünüyordu, şimdi anlamsız bir karakter kümesi gibi görünmüyor. Bu doğruysa - bu malzemenin varış yerini yerine getirdiği anlamına gelir. Aslında, düzenli ifadeler, tüm yaşamlarda meşgul olabilecek bir konudur, ancak söküldüğümüz küçük şey bile, oldukça gelişmiş metinler olan komut dosyalarını yazma konusunda size yardımcı olabilir.

Bu malzeme serisinde genellikle çok gösterdik basit örnekler Kelimenin tam anlamıyla birkaç satırdan oluşan bash komut dosyaları. Bir dahaki sefere daha büyük bir şey düşünüyoruz.

Sevgili okuyucular! Komut satırı komut dosyalarındaki metinleri işlerken düzenli ifadeler kullanıyor musunuz?

İyi zaman, misafirler!

Bugünün makalesinde, böyle büyük bir konuya dokunmak istiyorum. Düzenli ifadeler. Bence herkes regquins konusunun (bu nedenle düzenli ifadelerin arandığında denir) - bir yazı miktarında büyük. Bu nedenle kısaca deneyeceğim, ancak düşüncelerimi bir grupta nasıl toplayacağınızı anlayabildiğiniz gibi ve bunları size iletmek.

Düzenli ifadelerin çeşitli çeşitleri olduğu gerçeğiyle başlayacağım:

1. Geleneksel düzenli ifadeler (temel, temel ve temel Düzenli İfadeler (BRE))

  • bu ifadelerin sözdizimi eski olarak tanımlanır, ancak yine de hala yaygındır ve birçok Unix yardımcı programı tarafından kullanılır.
  • Ana düzenli ifadeler aşağıdaki metaSimwols'u (aşağıdaki değerleri hakkında) içerir:
    • \\ (\\) - () için ilk seçenek () (Gelişmiş)
    • \\ (\\) - () için ilk seçenek () (Gelişmiş)
    • \n. nerede n. - 1 ila 9 arasındaki sayı
  • Veri MetaSimvols Kullanmanın Özellikleri:
    • Yıldız, tek bir sembole karşılık gelen bir ifadeden sonra takip etmelidir. Misal: *.
    • İfade \\ ( blok\\) * Yanlış olarak kabul edilmelidir. Bazı durumlarda, sıfır veya daha fazla tekrara karşılık gelir. blok . Diğerlerinde, ipe karşılık gelir. blok* .
    • Sembolik sınıfın içinde, özel karakter değerleri esas olarak göz ardı edilir. Özel durumlar:
    • Bir Sembol eklemek için bir sette bir sembol eklemek için, önce oraya yerleştirilmelidir.
    • Set'e bir sembol eklemek için, oraya ilk veya son olarak yerleştirilmelidir. Örneğin:
      • harflerin, sayıların, eksi ve nokta ayırıcısının içerebileceği DNS adlı şablon: [-0-9A-ZA-Z.];
      • eksi ve sayıların yanı sıra herhangi bir karakter: [^ -0-9].
    • Set'e bir [veya] sembolü eklemek için önce oraya yerleştirilmelidir. Örneğin:
      • karşılık gelir], [, a veya b.

2. Genişletilmiş Normal İfadeler (onlar genişletilmiş Normal İfadeler (ERE))

  • Bu ifadelerin sözdizimi, ana ifadelerin sözdizimine benzer:
    • Metasimvoller () ve () için ters örgü hattının kullanımını iptal etti.
    • Metacemolün önündeki ters batan hattı, özel anlamını iptal etti.
    • Teorik olarak reddedildi düzensiz tasarım \\ n. .
    • Metacimol + eklendi mi? , | .

3. Perl ile uyumlu düzenli ifadeler(onlar Perl uyumlu düzenli ifadeler (PCRE))

  • bir daha zengin ve aynı zamanda öngörülebilir sözdizimi posix ere'den bile, bu nedenle uygulamalar genellikle kullanılır.

Düzenli ifadeler oluşmaktadırşablonlar Şablonu belirtin Arama. Desen oluşur nın-nin kurallarderlenen arama sembollerve metasimvolov.

Arama Kuralları Aşağıdaki gibi tanımlandı operasyonlar:

Liste |

Dikey özellik (|) İzin verilen seçenekleri paylaşır, biri söyleyebilir - mantıksal veya. Örneğin, "Gri | Gri" karşılık gelir gri. veya gri..

Gruplandırma veya Birlik ()

Yuvarlak parantez Operatörlerin eylem alanını ve önceliğini belirlemek için kullanılır. Örneğin, "Gri | Gri" ve "GR (A | E) Y" farklı örneklerdir, ancak her ikisi de içeren bir seti tanımlar. gri. ve gri..

Niceleme ()? * +.

Nüsle Bir sembol veya gruptan sonra kaç kez belirler Öncekiİfade oluşabilir.

genel ifade, tekrarlar olabilir m'den n dahil.

genel ifade m ve daha fazla tekrarlama.

genel ifade n bir tekrarlama değil.

pürüzsüz n tekrarlar.

Soru işaretianlamına geliyor 0 veya 1. aynı zamanlar aynı {0,1} . Örneğin, "Colou? R" karşılık gelir renk, BEN. renk..

Staranlamına geliyor 0, 1 veya herhangi bir sayı Bir Zamanlar ( {0,} ). Örneğin, "GO * GLE" karşılık gelir ggle, gogle., google ve benzeri.

Bir artıanlamına geliyor en az 1. Bir Zamanlar ( {1,} ). Örneğin, "GO + GLE" maçları gogle., google vb (ama değil) ggle).

Bu düzenli ifadelerin belirli sözdizimi, uygulamaya bağlıdır. (içinde temel Düzenli İfadeler Semboller (ve)- Korumalı Backlash)

MetakterlerBasitçe, bunlar gerçek değerleriyle eşleşmeyen semboller, yani sembolüdür. (nokta) bir nokta değil, herhangi bir karakter vb. Lütfen metaSimvoller ve değerleri ile tanışın:

. karşılık vermek birherhangi bir sembol
[bir şey] Karşılık vermek kimseparantez içinde mahkum sayısından sembol. Aynı zamanda: "-" sembolü kelimenin tam anlamıyla yalnızca açıldıktan sonra veya kapanma bracketinin önünde bulunursa yorumlanır: veya [-ABC]. Aksi takdirde, karakterlerin aralığını gösterir. Örneğin, "A", "B" veya "C" ile karşılık gelir. Latin latin alfabesinin harflerine karşılık gelir. Bu tanımlar birleştirilebilir: "[" veya "]" karakterlerinin yazışmalarını belirlemek için A, B, C, Q, R, S, T, U, V, W, X, Y, ZC'ye karşılık gelir. Kapanış braketine, açıldıktan sonraki ilk karakterdi: "]", "[", "a" ya da "B" anlamına gelir. Kare parantez içindeki değer ^ sembolüyle sunulduysa, ekspresyonun değeri karşılık gelirse için tek sembol bunlardan hangi parantez içinde değil. Örneğin, [^ ABC] "A", "B" veya "C" hariç herhangi bir sembole karşılık gelir. [^ a-z], Latin alfabesindeki alt kayıtların sembolleri dışındaki herhangi bir karaktere karşılık gelir.
^ Metnin başlangıcına karşılık gelir (veya satır hattıysa herhangi bir dizgenin başlangıcı).
$ Metnin sonuna karşılık gelir (veya satır modu ise herhangi bir dizgenin sonu).
\\ (\\) veya () Daha sonra kullanılabilecek "adlı" (gruplandırılmış ifadeyi) duyurdu (aşağıdaki öğeye bakın: \\ n.). "Açıklanan abonelik" de bir "blok". Diğer operatörlerin aksine, bu (geleneksel sözdiziminde) bir Bexlesh gerektirir, uzatılmış ve perl sembolü \\ gerekli değildir.
\n. Nerede n. - Bu 1 ila 9 arasında bir rakamdır; karşılık vermek n.- Evde belirtilmiştir (örneğin (ABCD) \\ 0, yani ABCD karakterleri sıfıra dikkat çekilir). Bu tasarım teorik olarak düzensizDüzenli ifadelerin gelişmiş sözdiziminde kabul edilmedi.
*
  • Starbirim sembolüne karşılık gelen ifadeden sonra sıfırveya daha kopyabu (önceki) ifadenin. Örneğin, "*", "x", "Y", "ZX", "ZYX", vb. Boş bir dize karşılık gelir.
  • \n.*, nerede n. - Bu, 1 ila 9 arasında bir sayıdır, uygunluk için sıfır veya daha fazla girişe karşılık gelir. n.- İşaretli bir taklit. Örneğin, "\\ (a. \\) C \\ 1 *" "Abcab" ve "Abcaba", ancak "ABCAC" anlamına gelmez.

"\\ (" Ve "\\)" ve "*" eşliğinde "*" olarak sonuçlandırılmalıdır. Bazı durumlarda, parantez içine alınan dizenin sıfır veya daha fazla oluşumuna karşılık gelir. Diğerlerinde, "*" sembolü göz önüne alındığında, parantez içine alınmış ifadeye karşılık gelir.

\{x.,y.\} Sonuna karşılık gelir ( yaklaşan) en azından meydana gelen bir blok x. ve daha fazla yok y. zaman. Örneğin, "A \\ (3.5 \\)" "AAA", "AAAA" veya "AAAAA" a karşılık gelir. Diğer operatörlerin aksine, bu (geleneksel sözdiziminde) bir Bexlesh gerektirir.
.* Düzenli ifadenin iki kısmı arasındaki herhangi bir karakterden herhangi bir sayıda belirlenmesi.

MetaSimWalls Farklı uygunluk kullanmaya yardımcı oluruz. Ancak normal sembolün metaciumunu nasıl hayal edin, yani, Sembol [(Square Bracket) kare braketin değeri? Basitçe:

  • Önlemek için ( kalkan) Metacimol (. * + \\? ()) Boşluk. Örneğin \\. veya \\ [

Bazı karakter kümelerinin görevini basitleştirmek için, sözde olarak birleştirildi. karakterlerin sınıfları ve kategorileri. POSIX, aşağıdaki tabloda gösterildiği gibi bazı sınıfların ve karakter kategorilerinin standart bildirilmesi:

Posix sınıfı benzer şekilde belirleme
[: Üst:] Üst Kayıt Sembolleri
[: Alt:] alt kayıtların sembolleri
[: Alfa:] Üst ve alt kayıtların sembolleri
[: Alnum:] sayılar, üst ve alt kayıt sembolleri
[: Hane:] sayılar
[: xdigit:] onaltılık sayılar
[: Punct:] [.,!?:…] noktalama işaretleri
[: Boş:] [\\ t] boşluk ve sekme.
[: Uzay:] [\\ t \\ n \\ r \\ f \\ v] geçiş sembolleri
[: Cntrl:] kontrol sembolleri
[: Grafik:] [^ \\ t \\ n \\ r \\ f \\ v] baskı sembolleri
[: Yazdır:] [^ \\ t \\ n \\ r \\ f \\ v] yazdırma sembolleri ve sembolleri atla

Regex gibi bir şey var:

Regex açgözlülük

Mümkün olduğunca açık bir şekilde tarif etmeye çalışacağım. Diyelim ki her şeyi bulmak istiyoruz Html etiketleri Bazı metinlerde. Görevi yerel olarak, mahkumların değerlerini bulmak istiyoruz.< и >, bu topuklularla birlikte. Ama bu etiketlerin var olduğunu biliyoruz. farklı uzunluk Ve Etiketler kendileri, en az 50 parça. Bunları listeler, meta biçiminde sonuçlandırın - görev çok zaman alıcıdır. Ancak bir ifademiz olduğunu biliyoruz. * (Nokta Yıldız işareti), dizideki herhangi bir karakter sayısını karakterize eder. Bu ifade ile metninde bulmaya çalışacağız (

Yani, LSI MEGAGAID denetleyicisinde 10/50 baskın nasıl oluşturulur (İlgili ve: Intel SRCU42X, Intel SRCS16):

) arasındaki tüm değerler< и >. Sonuç olarak, tüm dize bu ifadeye karşılık gelir. Neden, çünkü REMEX - Zhaden ve arasındaki tüm karakter sayısını yakalamaya çalışır.< и >, sırasıyla, tüm hat başlıyor < p\u003e Yani, ...ve bitirme ...> Bu kurala ait olacak!

Umarım örneğin, açgözlülüğün ne olduğu açıktır. Bu açgözlülükten kurtulmak için bir sonraki yolda gidebilirsiniz:

  • karakterleri dikkate almak değil İlgili istenen numune (örneğin:<[^>] *\u003e Yukarıda açıklanan durum için)
  • İstenmeyen olarak bir miktar tanım ekleyerek açgözlülükten güvenilir:
    • *? - "açgözlü değil" ("tembel") eşdeğeri *
    • +? - "açgözlü değil" ("tembel") eşdeğer +
    • (n,)? - "açgözlü değil" ("tembel") eşdeğeri (n,)
    • . *? - "açgözlü değil" ("tembel") eşdeğeri. *

Yukarıdakilerin tümü eklemek istiyor genişletilmiş normal ifadelerin sözdizimi:

POSIX'deki düzenli ifadeler, geleneksel UNIX sözdizimine benzer, ancak bazı metasimvollerin eklenmesi ile:

Bir artıbelirtir öncekisembol veya gruptekrarlanabilir bir veya birkaç kez. Yıldızların aksine, en az bir tekrarı gereklidir.

Soru işareti Diyor öncekisembol veya grup isteğe bağlıdır. Başka bir deyişle, uygun çizgide yok veya mevcut olabilir pürüzsüz birzaman.

Dikey özellikpaylaşmak alternatif Seçenekler Düzenli ifadeler. Bir karakter iki alternatifi ayarlar, ancak daha fazlası olabilir, daha dikey çırpma kullanmak için yeterli. Bu operatörün ifadenin mümkün olan maksimum kısmını kullandığı unutulmamalıdır. Bu nedenle, alternatif operatör en sık parantez içinde kullanılır.

Ayrıca, ters örgü [... \\) kullanımı da iptal edildi (...) ve \\ (... \\) olur (...).

Gönderinin sonunda, regex kullanmanın bazı örneklerini vereceğim:

$ Kedi Text1 1 Apple 2 Armut 3 Muz $ GREP P Text1 1 Apple 2 Pear $ GREP "PP *" Text1 1 Apple 2 Pear $ Cat Text1 | GREP "L \\ | N" 1 Apple 3 muz $ echo -e "Burada bir \\ n * bul" | GREP "\\ *" * burada $ GREP "pl \\? * R" text11 # p, r 2 armut $ GREP "a .." Text1 # ile satırlarla, ardından en az 2 sembol 1 Apple 3 BANANA $ GREP "" TEŞEKKÜRÜ1 # 3 veya P 1 Apple 2 armut 3'ü var olan satırları arayın, "Burada bir \\ n * buradan \\ n \\ n * bulun." | GREP "[. *]" * Burada bir yerlerde ... isim] $ echo -e "123 \\ n456 \\ n789 \\ n0" | GREP "" 123 456 789 $ SED -E "/ (a. **) \\ | \\ (-p. * / A / S / A / / G" Text1 # değiştirme ve açık ve her satırda Gider ya da P, P 1 Apple 2 armut 3 muz * \\ ./ Son Word./g "First. Son bir kelime. Bu son bir kelimedir.

Saygılarımla, Mc.Sim!

Bugünün makalesinde, böyle büyük bir konuya dokunmak istiyorum. Düzenli ifadeler. Bence herkes regquins konusunun (bu nedenle düzenli ifadelerin arandığında denir) - bir yazı miktarında büyük.

Düzenli ifadelerin çeşitli çeşitleri olduğu gerçeğiyle başlayacağım:

1. Geleneksel düzenli ifadeler (temel, temel ve temel Düzenli İfadeler (BRE))

  • bu ifadelerin sözdizimi eski olarak tanımlanır, ancak yine de hala yaygındır ve birçok Unix yardımcı programı tarafından kullanılır.
  • Ana düzenli ifadeler aşağıdaki metaSimwols'u (aşağıdaki değerleri hakkında) içerir:
    • \\ (\\) - () için ilk seçenek () (Gelişmiş)
    • \\ (\\) - () için ilk seçenek () (Gelişmiş)
    • \n. nerede n. - 1 ila 9 arasındaki sayı
  • Veri MetaSimvols Kullanmanın Özellikleri:
    • Yıldız, tek bir sembole karşılık gelen bir ifadeden sonra takip etmelidir. Misal: *.
    • İfade \\ ( blok\\) * Yanlış olarak kabul edilmelidir. Bazı durumlarda, sıfır veya daha fazla tekrara karşılık gelir. blok . Diğerlerinde, ipe karşılık gelir. blok* .
    • Sembolik sınıfın içinde, özel karakter değerleri esas olarak göz ardı edilir. Özel durumlar:
    • Bir Sembol eklemek için bir sette bir sembol eklemek için, önce oraya yerleştirilmelidir.
    • Set'e bir sembol eklemek için, oraya ilk veya son olarak yerleştirilmelidir. Örneğin:
      • harflerin, sayıların, eksi ve nokta ayırıcısının içerebileceği DNS adlı şablon: [-0-9A-ZA-Z.];
      • eksi ve sayıların yanı sıra herhangi bir karakter: [^ -0-9].
    • Set'e bir [veya] sembolü eklemek için önce oraya yerleştirilmelidir. Örneğin:
      • karşılık gelir], [, a veya b.

2. Genişletilmiş Normal İfadeler (onlar genişletilmiş Normal İfadeler (ERE))

  • Bu ifadelerin sözdizimi, ana ifadelerin sözdizimine benzer:
    • Metasimvoller () ve () için ters örgü hattının kullanımını iptal etti.
    • Metacemolün önündeki ters batan hattı, özel anlamını iptal etti.
    • Teorik olarak reddedildi düzensiz tasarım \\ n. .
    • Metacimol + eklendi mi? , | .

3. Perl ile uyumlu düzenli ifadeler(onlar Perl uyumlu düzenli ifadeler (PCRE))

  • bir daha zengin ve aynı zamanda öngörülebilir sözdizimi posix ere'den bile, bu nedenle uygulamalar genellikle kullanılır.

Düzenli ifadeler oluşmaktadırşablonlar Şablonu belirtin Arama. Desen oluşur nın-nin kurallarderlenen arama sembollerve metasimvolov.

Arama Kuralları Aşağıdaki gibi tanımlandı operasyonlar:

Liste |

Dikey özellik (|) İzin verilen seçenekleri paylaşır, biri söyleyebilir - mantıksal veya. Örneğin, "Gri | Gri" karşılık gelir gri. veya gri..

Gruplandırma veya Birlik ()

Yuvarlak parantez Operatörlerin eylem alanını ve önceliğini belirlemek için kullanılır. Örneğin, "Gri | Gri" ve "GR (A | E) Y" farklı örneklerdir, ancak her ikisi de içeren bir seti tanımlar. gri. ve gri..

Niceleme ()? * +.

Nüsle Bir sembol veya gruptan sonra kaç kez belirler Öncekiİfade oluşabilir.

genel ifade, tekrarlar olabilir m'den n dahil.

genel ifade m ve daha fazla tekrarlama.

genel ifade n bir tekrarlama değil.

pürüzsüz n tekrarlar.

Soru işaretianlamına geliyor 0 veya 1. aynı zamanlar aynı {0,1} . Örneğin, "Colou? R" karşılık gelir renk, BEN. renk..

Staranlamına geliyor 0, 1 veya herhangi bir sayı Bir Zamanlar ( {0,} ). Örneğin, "GO * GLE" karşılık gelir ggle, gogle., google ve benzeri.

Bir artıanlamına geliyor en az 1. Bir Zamanlar ( {1,} ). Örneğin, "GO + GLE" maçları gogle., google vb (ama değil) ggle).

Bu düzenli ifadelerin belirli sözdizimi, uygulamaya bağlıdır. (içinde temel Düzenli İfadeler Semboller (ve)- Korumalı Backlash)

MetakterlerBasitçe, bunlar gerçek değerleriyle eşleşmeyen semboller, yani sembolüdür. (nokta) bir nokta değil, herhangi bir karakter vb. Lütfen metaSimvoller ve değerleri ile tanışın:

. karşılık vermek birherhangi bir sembol
[bir şey] Karşılık vermek kimseparantez içinde mahkum sayısından sembol. Aynı zamanda: "-" sembolü kelimenin tam anlamıyla yalnızca açıldıktan sonra veya kapanma bracketinin önünde bulunursa yorumlanır: veya [-ABC]. Aksi takdirde, karakterlerin aralığını gösterir. Örneğin, "A", "B" veya "C" ile karşılık gelir. Latin latin alfabesinin harflerine karşılık gelir. Bu tanımlar birleştirilebilir: "[" veya "]" karakterlerinin yazışmalarını belirlemek için A, B, C, Q, R, S, T, U, V, W, X, Y, ZC'ye karşılık gelir. Kapanış braketine, açıldıktan sonraki ilk karakterdi: "]", "[", "a" ya da "B" anlamına gelir. Kare parantez içindeki değer ^ sembolüyle sunulduysa, ekspresyonun değeri karşılık gelirse için tek sembol bunlardan hangi parantez içinde değil. Örneğin, [^ ABC] "A", "B" veya "C" hariç herhangi bir sembole karşılık gelir. [^ a-z], Latin alfabesindeki alt kayıtların sembolleri dışındaki herhangi bir karaktere karşılık gelir.
^ Metnin başlangıcına karşılık gelir (veya satır hattıysa herhangi bir dizgenin başlangıcı).
$ Metnin sonuna karşılık gelir (veya satır modu ise herhangi bir dizgenin sonu).
\\ (\\) veya () Daha sonra kullanılabilecek "adlı" (gruplandırılmış ifadeyi) duyurdu (aşağıdaki öğeye bakın: \\ n.). "Açıklanan abonelik" de bir "blok". Diğer operatörlerin aksine, bu (geleneksel sözdiziminde) bir Bexlesh gerektirir, uzatılmış ve perl sembolü \\ gerekli değildir.
\n. Nerede n. - Bu 1 ila 9 arasında bir rakamdır; karşılık vermek n.- Evde belirtilmiştir (örneğin (ABCD) \\ 0, yani ABCD karakterleri sıfıra dikkat çekilir). Bu tasarım teorik olarak düzensizDüzenli ifadelerin gelişmiş sözdiziminde kabul edilmedi.
*
  • Starbirim sembolüne karşılık gelen ifadeden sonra sıfırveya daha kopyabu (önceki) ifadenin. Örneğin, "*", "x", "Y", "ZX", "ZYX", vb. Boş bir dize karşılık gelir.
  • \n.*, nerede n. - Bu, 1 ila 9 arasında bir sayıdır, uygunluk için sıfır veya daha fazla girişe karşılık gelir. n.- İşaretli bir taklit. Örneğin, "\\ (a. \\) C \\ 1 *" "Abcab" ve "Abcaba", ancak "ABCAC" anlamına gelmez.

"\\ (" Ve "\\)" ve "*" eşliğinde "*" olarak sonuçlandırılmalıdır. Bazı durumlarda, parantez içine alınan dizenin sıfır veya daha fazla oluşumuna karşılık gelir. Diğerlerinde, "*" sembolü göz önüne alındığında, parantez içine alınmış ifadeye karşılık gelir.

\{x.,y.\} Sonuna karşılık gelir ( yaklaşan) en azından meydana gelen bir blok x. ve daha fazla yok y. zaman. Örneğin, "A \\ (3.5 \\)" "AAA", "AAAA" veya "AAAAA" a karşılık gelir. Diğer operatörlerin aksine, bu (geleneksel sözdiziminde) bir Bexlesh gerektirir.
.* Düzenli ifadenin iki kısmı arasındaki herhangi bir karakterden herhangi bir sayıda belirlenmesi.

MetaSimWalls Farklı uygunluk kullanmaya yardımcı oluruz. Ancak normal sembolün metaciumunu nasıl hayal edin, yani, Sembol [(Square Bracket) kare braketin değeri? Basitçe:

  • Önlemek için ( kalkan) Metacimol (. * + \\? ()) Boşluk. Örneğin \\. veya \\ [

Bazı karakter kümelerinin görevini basitleştirmek için, sözde olarak birleştirildi. karakterlerin sınıfları ve kategorileri. POSIX, aşağıdaki tabloda gösterildiği gibi bazı sınıfların ve karakter kategorilerinin standart bildirilmesi:

Posix sınıfı benzer şekilde belirleme
[: Üst:] Üst Kayıt Sembolleri
[: Alt:] alt kayıtların sembolleri
[: Alfa:] Üst ve alt kayıtların sembolleri
[: Alnum:] sayılar, üst ve alt kayıt sembolleri
[: Hane:] sayılar
[: xdigit:] onaltılık sayılar
[: Punct:] [.,!?:…] noktalama işaretleri
[: Boş:] [\\ t] boşluk ve sekme.
[: Uzay:] [\\ t \\ n \\ r \\ f \\ v] geçiş sembolleri
[: Cntrl:] kontrol sembolleri
[: Grafik:] [^ \\ t \\ n \\ r \\ f \\ v] baskı sembolleri
[: Yazdır:] [^ \\ t \\ n \\ r \\ f \\ v] yazdırma sembolleri ve sembolleri atla

Regex gibi bir şey var:

Regex açgözlülük

Mümkün olduğunca açık bir şekilde tarif etmeye çalışacağım. Bazı metinlerde tüm HTML etiketlerini bulmak istediğimizizi varsayalım. Görevi yerel olarak, mahkumların değerlerini bulmak istiyoruz.< и >, bu topuklularla birlikte. Ancak, etiketlerin farklı bir uzunluk ve etiketlerin, en az 50 parçaya sahip olduğunu biliyoruz. Hepsini listeler, MetaMamivol'da sonuçlandırın - görev çok zaman alıcıdır. Ancak bir ifademiz olduğunu biliyoruz. * (Nokta Yıldız işareti), dizideki herhangi bir karakter sayısını karakterize eder. Bu ifade ile metninde bulmaya çalışacağız (

Yani, LSI MEGAGAID denetleyicisinde 10/50 baskın nasıl oluşturulur (İlgili ve: Intel SRCU42X, Intel SRCS16):

) arasındaki tüm değerler< и >. Sonuç olarak, tüm dize bu ifadeye karşılık gelir. Neden, çünkü REMEX - Zhaden ve arasındaki tüm karakter sayısını yakalamaya çalışır.< и >, sırasıyla, tüm hat başlıyor < p\u003e Yani, ...ve bitirme ...> Bu kurala ait olacak!

Umarım örneğin, açgözlülüğün ne olduğu açıktır. Bu açgözlülükten kurtulmak için bir sonraki yolda gidebilirsiniz:

  • karakterleri dikkate almak değil İlgili istenen numune (örneğin:<[^>] *\u003e Yukarıda açıklanan durum için)
  • İstenmeyen olarak bir miktar tanım ekleyerek açgözlülükten güvenilir:
    • *? - "açgözlü değil" ("tembel") eşdeğeri *
    • +? - "açgözlü değil" ("tembel") eşdeğer +
    • (n,)? - "açgözlü değil" ("tembel") eşdeğeri (n,)
    • . *? - "açgözlü değil" ("tembel") eşdeğeri. *

Yukarıdakilerin tümü eklemek istiyor genişletilmiş normal ifadelerin sözdizimi:

POSIX'deki düzenli ifadeler, geleneksel UNIX sözdizimine benzer, ancak bazı metasimvollerin eklenmesi ile:

Bir artıbelirtir öncekisembol veya gruptekrarlanabilir bir veya birkaç kez. Yıldızların aksine, en az bir tekrarı gereklidir.

Soru işareti Diyor öncekisembol veya grup isteğe bağlıdır. Başka bir deyişle, uygun çizgide yok veya mevcut olabilir pürüzsüz birzaman.

Dikey özellikdüzenli ifadeler için alternatif seçenekleri paylaşır. Bir karakter iki alternatifi ayarlar, ancak daha fazlası olabilir, daha dikey çırpma kullanmak için yeterli. Bu operatörün ifadenin mümkün olan maksimum kısmını kullandığı unutulmamalıdır. Bu nedenle, alternatif operatör en sık parantez içinde kullanılır.

Ayrıca, ters örgü [... \\) kullanımı da iptal edildi (...) ve \\ (... \\) olur (...).

Gönderinin sonunda, regex kullanmanın bazı örneklerini vereceğim:

$ Cat Text1 1 Apple 2 Armut 3 Muz $ GREP P Text1 1 Apple 2 Pear $ GREP Bezelye Text1 2 Pear $ GREP "P *" Text1 1 Apple 2 Armut 3 Muz $ GREP "PP *" Text1 1 Apple 2 Pear $ GREP " X "Text1 $ GREP" x * "Text1 1 Apple 2 Armut 3 Muz $ Cat Text1 | GREP "L \\ | N" 1 Apple 3 muz $ echo -e "Burada bir \\ n * bul" | GREP "\\ *" * Burada $ GREP "PP \\ +" text1 # dizeleri, bir P ve 1 veya daha fazla p 1 Apple $ GREP "PL \\? E" text1 1 Apple 2 PEAR $ GREP "pl \\? E "Muhtemel Sembolü ile Text1 # PE, 1 Apple 2 PEAR $ GREP" P. * R "Text1 # P, R 2 Pear $ GREP" a .. "Text1 # ile satırlar, ardından En az 2 karakter 1 Apple 3 MANANA $ GREP "\\ (A \\) \\ +" Text1 # Daha fazlası için Ara 3 Muz $ GREP "Bir \\ (bir \\) \\ +" Text1 # 2x için arama 3 muz $ GREP "" Text1 # Arama satırları, 3 ya da p 1 Apple 2 armut 3 MANANA $ ETHO -E "Bul A \\ N * Burada \\ nsomewher." | Grep "[. *]" * Herewhere. $ # 3 ila 7 $ echo -e "123 \\ n456 \\ n789 \\ n0" için semboller arıyor | GREP "" "" 123 456 789 $ # Bir rakam arıyorum, arkasında, arkasında N ve R $ GP çizginin sonuna kadar bir harf yok "[[: digit:]] [^ nr] * $" Text1 1 Apple $ SED -E "/ \\ (a. * A \\) \\ | \\ (s. * P \\) / s / a / g" Text1 # değiştirme ve A, tüm çizgilerde, burada ve sonra r gider 1 Apple 2 armut 3 muz $ sed -e "/ ^ [^ lmnxyz] * $ / s / kulak / her / g" Text1 # LMNXYZ 1 Apple 2 Şeftali 3 MUMANA $ ECHO'NUN BAŞLANMIŞINDA HER HATLARDA KULAN YAPMAK . Bir cümle. Bu bir duyarlılıktır. " | \\ # Son kelimeyi son dünyadaki bir cümleyle değiştirme. \u003e SED -E "S / [^] * \\ ./ Son Word./G" İlk. Son bir kelime. Bu son bir kelimedir.

Düzenli ifadeler, çeşitli görevleri çözmek için kullanılabilecek, şablon, işleme ve satırlardaki metni aramak için çok güçlü bir araçtır. İşte bunların ana şunudur:

  • Metin girişini kontrol etme;
  • Dosyadaki metni arayın ve değiştirin;
  • Paket yeniden adlandırma dosyaları;
  • Apache gibi hizmetlerle etkileşim;
  • Şablonla eşleşecek dizgiyi kontrol etme.

Çok uzak tam listeDüzenli ifadeler daha fazla yapmanıza izin verir. Ancak yeni kullanıcılar için, onları oluşturmak için özel bir dil kullanıldığı için çok karmaşık görünebilirler. Ancak sağlanan fırsatlar göz önüne alındığında, Linux'un düzenli ifadeleri her birini bilmeli ve kullanabilmelidir. sistem yöneticisi.

Bu yazıda, yeni başlayanlar için düzenli bash ifadelerini düşünürüz, böylece bu aracın tüm yeteneklerini ele alabilirsiniz.

Düzenli ifadelerde, iki karakter türü kullanılabilir:

  • sıradan harfler;
  • metacimol.

Geleneksel karakterler, herhangi bir çizginin oluştuğu harfler, sayılar ve noktalama işaretleridir. Tüm metinler harflerden oluşur ve metinde istediğiniz konumu aramak için normal ifadelerde kullanabilirsiniz.

MetaSimwalls başka bir şey, normal ifadelere güç verenler. Metasimvol'un yardımıyla, bir sembol aramaktan çok daha fazlasını yapabilirsiniz. Karakter kombinasyonlarını arayabilir, numaralarının dinamik numarasını kullanın ve aralıkları seçebilirsiniz. Tüm özel karıştırıcılar iki türe ayrılabilir, bunlar geleneksel karakterlerle değiştirilen yedek semboller veya sembolün kaç kez tekrarlayabileceğini gösteren ifadelerdir. Düzenli ifadenin sözdizimi şöyle görünecektir:

normal_simviv Özel Mixer_Productor

Özel simal_zames Özel Mixer_Productor

  • - Ters bir örgü ile, alfabetik uzmanlar başlar ve noktalama işaretleri şeklinde özel bir monitörün kullanılması gerekiyorsa kullanılır;
  • ^ - çizginin başlangıcını gösterir;
  • $ - çizginin sonunu gösterir;
  • * - Önceki sembolün 0 veya daha fazla tekrarlanabileceğini gösterir;
  • + - Önceki sembolün bir veya daha fazla kez tekrarlamasının gerektiğini belirtir;
  • ? - Önceki sembol sıfır veya bir kez oluşabilir;
  • (N) - Önceki sembolü tekrarlamak için kaç kez ihtiyacınız olduğunu gösterir;
  • (N, n) - Önceki sembol N ila N kere tekrarlanabilir;
  • . - Dize çevirisinin yanı sıra herhangi bir karakter;
  • - Parantez içinde belirtilen herhangi bir karakter;
  • x | W. - Sembol x veya y sembolü;
  • [^ AZ] - Parantez içinde belirtilenler dışında herhangi bir karakter;
  • - Belirtilen aralıktaki herhangi bir karakter;
  • [^ a-z] - Aralıkta olmayan herhangi bir karakter;
  • b. - Bir boşluk olan kelime sınırını belirtir;
  • B. - Sembolün kelimenin içinde olması gerektiğini, örneğin UX, UXB veya Smokin ile çakıştığını, ancak Linux ile çakışmaz;
  • d. - karakterin bir rakam olduğu anlamına gelir;
  • D. - Syfactory Olmayan Sembol;
  • n. - Hat çeviri sembolü;
  • s. - Alanın sembollerinden biri, boşluk, tablolama vb.;
  • S. - Bir boşluğun yanı sıra herhangi bir karakter;
  • t. - Tabl sembolü;
  • v. - Dikey tablolmanın sembolü;
  • w. - alt çizgi dahil olmak üzere herhangi bir harf sembolü;
  • W. - altı çizili hariç herhangi bir harf sembolü;
  • uxxx - Unicdoe sembolü.

İkonik spesiyallerden önce, uzmanın bir sonraki olduğunu belirtmek için eğik özellik kullanmanız gerektiğini not etmek önemlidir. Bu doğru ve tam tersi, eğer geleneksel bir sembol olarak eğik çizgi olmadan uygulanan bir uzman kullanmak istiyorsanız, eğim eklemek zorunda kalacaksınız.

Örneğin, metinde 1+ 2 \u003d 3 satırı bulmak istiyorsunuz. Bu satırı düzenli bir ifade olarak kullanırsanız, hiçbir şey bulamazsınız, çünkü sistem bir artı bir artı bir uzmanı olarak yorumlar, bu da önceki birimin bir veya daha fazla kez tekrarlanması gerektiğini bildiren bir uzmanı olarak yorumlar. Bu nedenle, korunması gerekir: 1 + 2 \u003d 3. Koruyucu olmadan, normal ifademiz sadece 11 \u003d 3 veya 111 \u003d 3 vb. Bir dize karşılık gelir. Hattan önce gerekli değildir, çünkü bir uzman değildir.

Düzenli ifadeleri kullanma örnekleri

Artık temelleri düşündük ve her şeyin nasıl çalıştığını biliyoruz, düzenli Linux GREP ifadeleri hakkında edinilen bilgiyi pratikte birleştirmeye devam ediyor. İki kullanışlı özel sembol, dizenin başlangıcını ve sonunu gösteren ^ ve $ 'dir. Örneğin, tüm kullanıcıların adı S adına başladığı sistemimizde kayıtlı olmak istiyoruz. O zaman düzenli bir ifade uygulayabilirsiniz. «^ S». EGREP komutunu kullanabilirsiniz:

egrep "^ S" / etc / passwd

Satırdaki son karakterine göre dizeleri seçmek istiyorsak, bunun için $ olarak kullanılabilecek. Örneğin, tümünü seçin sistem kullanıcıları, bir kabuk olmadan, bu tür kullanıcılarla ilgili kayıtlar Yanlış:

egrep "yanlış $" / etc / passwd

S veya D'de başlayan kullanıcı adlarını görüntülemek için, böyle bir ifadeyi kullanın:

egrep "^" / etc / passwd

Aynı sonuç "|" sembolü kullanılarak elde edilebilir. İlk seçenek aralıklar için daha uygundur ve ikincisi genellikle normal veya / veya:

egrep "^" / etc / passwd

Şimdi, adı üç karakter olmayan tüm kullanıcıları seçelim. Kullanıcı adı bir kolonla tamamlandı. Kolondan önce üç kez tekrarlanması gereken herhangi bir harf sembolü içerebileceğini söyleyebiliriz:

eGREP "^ W (3):" / etc / passwd

sonuç

Bu makalede, düzenli Linux ifadelerini inceledik, ancak bunlar sadece çoğu temeldi. Biraz daha derin sigara içiyorsanız, bu araçla çok daha ilginç şeyler yapabileceğinizi göreceksiniz. Düzenli ifadelerin geliştirilmesine harcanan zaman kesinlikle buna mal olacak.

Dersin sonunda Yandex Pro normal ifadeler: