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ı.
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.
$ 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"
$ 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. |
* |
"\\ (" 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. |
* |
"\\ (" 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: