Meny
Är gratis
checka in
den huvudsakliga  /  Program / Regelbundna UNIX-uttryck. Med vanliga uttryck (regex) i Linux

Regelbundna UNIX-uttryck. Med vanliga uttryck (regex) i Linux

Original: Linux Fundamentals
Upplagt av: Paul Cobbaut
Publiceringsdatum: 16 oktober 2014
Översättning: a.Panin
Översättning Datum: 17 december 2014

Kapitel 19. Regelbundna uttryck

Mekanismen för reguljära uttryck är ett mycket kraftfullt Linux-verktyg. Vanliga uttryck Kan användas när man arbetar med en mängd olika program, som bash, vi, byt namn, grep, sed och andra.

I det här kapitlet presenteras grundläggande information om reguljära uttryck.

Regelbundna uttryckssyntaxversioner

Det finns tre olika versioner av vanliga uttryck.

Beroende på det använda verktyget kan det användas ett eller flera specifika.

Till exempel stöder GREP-verktyget en parameter -E, vilket gör att du kan använda syntaxen för utökade vanliga uttryck (ERE) (ERE) när du analyserar ett regelbundet uttryck, vilket i tiden som parameter -g möjliggör att använda den grundläggande syntaxen för Regelbundna uttryck (BRE) och -P-parametern - Syntaxen för de reguljära uttrycken av Perl-programmeringsspråket (PCRE).

Med hänsyn till det faktum att GREP-verktyget också stöder -f-parametern som låter dig läsa ett vanligt uttryck utan bearbetning.

SED-verktyget stöder också parametrarna för att välja syntaxen för reguljära uttryck.

Läs alltid riktlinjerna för de använda instrumenten!

Utility grep.

Slutsats av strängar som matchar mallen

GREP Utility är ett populärt Linux-verktyg som är utformat för att söka efter rader som matchar en specifik mall. Nedan är exempel på de enklaste regelbundna uttryck som kan användas när de arbetar med det.

Detta är innehållet i testfilen som används i exemplen. Den här filen innehåller tre linjer (eller tre symboler på en ny linje). [E-post skyddad]: ~ $ Katt namn Tania Laura Valentina

När du söker efter en separat karaktär visas endast de linjer som innehåller en viss symbol. [E-post skyddad]: ~ $ Grep du namn Laura [E-post skyddad]: ~ $ Grep e namn valentina [E-post skyddad]: ~ $ Grep jag heter tania valentina

En jämförelse med mallen som används i detta exempel är uppenbart; I händelse av att den angivna symbolen finns i strängen, visar GREP-verktyget den här strängen.

Kombinera symboler

För att söka efter kombinationer av tecken i linjer bör symbolerna med regelbundet uttryck kombineras på samma sätt.

Detta exempel visar principen om drift av GREP-verktyget, beroende på vilket det vanliga uttrycket IA kommer att motsvara Tan IA-strängen, men inte strängen Va Lent I na, och det vanliga uttrycket i valet i en linje, men inte Ta ni a. [E-post skyddad]: ~ $ Grep en namn Tania Laura Valentina [E-post skyddad]: ~ $ Grep ia namnen tania [E-post skyddad]: ~ $ Grep i namn valentina [E-post skyddad]:~$

En eller annan symbol

Både i PCRE-syntaxen och i ERE-syntaxen kan en symbol för att skapa en programkanal användas, vilket i det här fallet kommer att skicka in en logisk operation "eller". I det här exemplet söker vi med de grep verktyg av de strängar där jag karaktärer uppstår eller en symbol a. [E-post skyddad]: ~ $ Cat List Tania Laura [E-post skyddad]: ~ $ Grep -e "jag | en" lista tania laura

Observera att vi använder parametern -E-GREP-verktygen för den tvingade tolkningen av vårt vanliga uttryck som ett uttryck med vanlig syntax av reguljära uttryck (ERE).

Vi måste skydda en symbol för att skapa en mjukvarukanal i ett vanligt uttryck med hjälp av den grundläggande syntaxen för reguljära uttryck (BRE) för en liknande tolkning av denna karaktär som en logisk operation "eller". [E-post skyddad]: ~ $ Grep -g "jag | en" lista [E-post skyddad]: ~ $ Grep -g "i \\ | en" lista tania laura

En eller flera tillfälligheter

* Symbolen motsvarar noll, en eller flera poster i den föregående symbolen och den + -följande tecken symbolen. [E-post skyddad]: ~ $ Kattlista2 ll lol lool loool [E-post skyddad]: ~ $ Grep -e "o *" lista2 ll lol lool loool [E-post skyddad]: ~ $ Grep -e "o +" lista2 lol lool loool [E-post skyddad]:~$

Tillfällighet i slutet av strängen

I följande exempel använder vi den här filen: [E-post skyddad]: ~ $ Katt namn Tania Laura Valentina Fleur Floor

I två exempel är följande metod för användning av en dollar symbol för att söka en tillfälle i slutet av linjen. [E-post skyddad]: ~ $ Grep a $ namn tania laura valentina [E-post skyddad]: ~ $ Grep r $ namn fleur golv

Tillfällighet i början av linjen

Insatssymbolen (^) låter dig söka efter tillfället i början (eller från den första tecknen) -strängen.

I dessa exempel används den ovanstående filen. [E-post skyddad]: ~ $ Grep ^ val namn valentina [E-post skyddad]: ~ $ Grep ^ f namn fleur golv

Symbolerna för dollarn och insatserna som används i reguljära uttryck kallas ankare (ankare).

Ordfördelning

Skydd av önskade ord med gapsymboler är inte en bra lösning (eftersom andra tecken också kan användas som ordseparatorer). I exemplet nedan visar metoden att använda en sekvens av tecken \\ B för att söka efter rader med ett givet ord, inte en sekvens av tecken: [E-post skyddad]: ~ $ Grep "\\ bover \\ b" text vintern är över. Kan du komma där borta? [E-post skyddad]:~$

Observera att GREP-verktyget också stöder den -W-parametern som är utformad för att söka efter sökningen. [E-post skyddad]: ~ $ Katttext som styraren styrs. Vintern är över. Kan du komma där borta? [E-post skyddad]: ~ $ Grep -w över text Vintern är över. Kan du komma där borta? [E-post skyddad]:~$

Inställningsverktyg grep.

Ibland visar det sig vara lättare att kombinera ett enkelt regelbundet uttryck med parametrarna för GREP-verktyget, istället för att skapa ett mer komplext regelbundet uttryck. Dessa parametrar diskuterades tidigare: Grep -i grep -v grep -w grep -a5 grep -b5 grep -c5

Förhindra beskrivningen av regelbundet uttryck av kommandokalet

Dollarnsymbolen är en speciell symbol för både för regelbundet uttryck och för kommandokalan (kom ihåg kommandotskalvariablerna och de inbäddade kommandokalarna). Baserat på detta är det rekommenderat att skydda regelbundna uttryck under några omständigheter, eftersom screeningen av ett vanligt uttryck gör att du kan förhindra att det här uttrycket beskrivs. [E-post skyddad]: ~ $ GREP "R $" Namn Fleur Floor Byt namn

Utility byt namn.

Genomförande av Rename Utility

I DEBAIN Linux-distributionen är / USR / Bin / Rename-sökvägen en länk till / USR / Bin / Prename-scenariot, installerat från Perl-paketet. [E-post skyddad] ~ $ Dpkg -s $ (Readlink -f $ (som byt namn) Perl: / usr / bin / preneame

I utdelningar baserade på den röda hattfördelningen skapas det inte en liknande symbolisk referens för att ange det beskrivna skriptet (självklart, med undantag för fall när en symbolisk länk till det manuellt skapas manuellt), så det här avsnittet beskrivs inte Rename Utility från Distribution Red Hat.

I diskussionerna om byt namn på internet uppträder vanligtvis förvirring på grund av det faktum att beslut som fungerar perfekt i Debian-distributionen (liksom Ubuntu, Xubuntu, Mint, ...) kan inte användas i den röda hattfördelningen (som Väl som centos, Fedora, ...).

Paketperl

Kommandot Byt namn är faktiskt implementerat i form av ett skript med regelbundna Perl-programmeringsspråk. Med den fullständiga bruksanvisningen för att använda det här skriptet kan du läsa efter kommandot perldoc Perlrequick (efter installationen av Perldoc-paketet). [E-post skyddad]: ~ #ptitude Install Perl-doc Följande nya paket kommer att installeras: PERL-DOC 0 Paket Uppdaterade, 1 installerade nya, 0 paket noteras att radera, och 0 paket uppdateras inte. Det är nödvändigt att få 8 170 kb arkiv. Efter att ha packat upp 13,2 MB kommer ockuperat. Få: 1 http://mirrordiektort.raspbian.org/raspbian/ Wheezy / Main Perl-do ... 8,170 kb i 19c (412 kb / s) Välj ett tidigare vald Perl-Doc-paket. (Läser databasen ... på det här ögonblicket 67121 Fil och katalog är installerade.) Perl-doc (från ... / perl-doc_5.14.2-21 + rpi2_all.deb) ... Lägger till "Divesion of / Usr / Bin / perdoc till / usr / bin / perdoc. Stud av Perl-doc "Behandlade triggers för MAN-DB ... PERL-DOC-paketet är konfigurerat (5.14.2-21 + RPI2) ... [E-post skyddad]: ~ # Perldoc perlrequick

Välkänd syntax

Oftast används Rename Utility för att söka efter filer med namn som motsvarar en specifik mall i form av en sträng och ersätta den här strängen till en annan rad.

Typiskt beskrivs denna åtgärd med användning av ett vanligt uttryck S / String / annan linje /, såsom visas i exemplet: [E-post skyddad] ~ $ Ls abc allfiles.txt bllfiles.txt scratch tennis2.txt abc.conf backup cllfiles.txt temp.txt tennis.txt [E-post skyddad] ~ $ Byt namn på "s / txt / text /" * [E-post skyddad] ~ $ Ls abc allfiles.text bllfiles.text scratch tennis2.text abc.conf backup cllfiles.text temp.text tennis.text

Och under är ett annat exempel, som använder den välkända syntaxen för Rename Utility för att upprepade gånger ändra förlängningarna av samma filer: [E-post skyddad] ~ $ Ls abc allfiles.text bllfiles.text scratch tennis2.text abc.conf backup cllfiles.text temp.text tennis.text [E-post skyddad] ~ $ Byt namn på "S / Text / TXT /" * .text [E-post skyddad] ~ $ Ls abc allfiles.txt bllfiles.txt scratch tennis2.txt abc.conf backup cllfiles.txt temp.txt tennis.txt [E-post skyddad] ~ $

Dessa två exempel är användbara för anledningen att de strängar vi använder är uteslutande i filtillägg. Glöm inte att filtillägg spelar ingen roll när du arbetar med Bash Command Shell.

Följande exempel visar det problem som du kan stöta på när du använder den här syntaxen. [E-post skyddad] ~ $ Touch Atxt.txt [E-post skyddad] ~ $ Byt namn på "s / txt / problem /" atxt.txt [E-post skyddad] ~ $ Ls abc allfiles.txt backup cllfiles.txt temp.txt tennis.txt abc.conf aproblem.txt bllfiles.txt scratch tennis2.txt [E-post skyddad] ~ $

Vid exekvering av det aktuella kommandot utförs en ersättning av exceptionellt den första posten av den önskade strängen.

Global ersättning

Syntaxen som används i föregående exempel kan beskrivas enligt följande: S / Regular Expression / String för ersättning /. Denna beskrivning är enkel och uppenbar, eftersom du bara måste placera ett regelbundet uttryck mellan de två första snedstreckarna och en rad för att ersätta mellan de två sista raderna.

I följande exempel utökas denna syntax något på grund av tillsatsen av modifieraren. [E-post skyddad] ~ $ Rename -N "s / txt / txt / g" atxt.txt atxt.txt bytt namn som atlt.txt [E-post skyddad] ~ $

Nu kan den syntax som vi använde beskrivas som S / Regular Expression / String för ersättning / G, där modifieraren S är en ersättningsoperation (switch) och G modifieraren rapporterar behovet av att genomföra global ersättning (Global).

Observera att i det här exemplet användes -N-parametern för att visa information om operationen som utfördes (istället för att utföra själva operationen, som består av direkt renovering av filen).

Byte utan registrering

En annan modifierare som kan vara användbar är en modifierare I. Exemplet nedan visar metoden att ersätta strängen till en annan linje utan att registrera registret. [E-post skyddad]: ~ / Filer $ ls file1.text file2.text file3.txt [E-post skyddad]: ~ / Filer $ Byt namn på "s / .text / .txt / jag" * [E-post skyddad]: ~ / Filer $ ls file1.txt file2.txt file3.txt [E-post skyddad]: ~ / Filer $

Ändra tillägg

Laggränssnitt linux strängar Det finns ingen aning om filtillägg som liknar MS-DOS som är tillämpliga i operativsystemet, men många användare och applikationer med ett grafiskt gränssnitt använder dem.

Det här avsnittet ger ett exempel på att använda Rename Utility för att ändra exklusivt filtillägg. Exemplet använder dollarnsymbolen för att indikera att referenspunkten för ersättningen är slutet på filnamnet. [E-post skyddad] ~ $ Ls * .txt allfiles.txt bllfiles.txt cllfiles.txt verkligen.txt.txt temp.txt tennis.txt [E-post skyddad] ~ $ Byt namn på "s / .txt $ /. Txt /" * .txt [E-post skyddad] ~ $ Ls * .txt allfiles.txt bllfiles.txt cllfiles.txt verkligen.txt.txt temp.txt tennis.txt [E-post skyddad] ~ $

Observera att dollarnsymbolen inom det vanliga uttrycket indikerar slutet på linjen. Utan dollarnsymbolen bör utförandet av det här kommandot slutföras vid tidpunkten för behandlingen av den egentligen.txt.txt-filen.

Sedverktyg

Data Stream Editor

Data Stream Editor (Stream Editor) eller, för korthet, sedverktyget använder regelbundna uttryck för att ändra dataströmmen.

I det här exemplet används sedverktyget för att ersätta strängen. Echo måndag | Sed "s / monon / sek /" tisdag

Slash kan ersättas med några andra tecken som kan vara bekvämare och förbättrad lagläsbarhet i vissa fall. Echo måndag | SED "S: Måndag: För det andra:" Tisdag Echo måndag | Sed "s_- region_vtor_" tisdag echo måndag | Sed "s | måndag | råtta |" Tisdag

Interaktiv redaktör

Trots det faktum att sed-verktyget är utformat för att hantera dataströmmar, kan den också användas för interaktiv filbehandling. [E-post skyddad]: ~ / Filer $ echo måndag\u003e idag [E-post skyddad]: ~ / Filer $ katt idag måndag [E-post skyddad]: ~ / Filer $ sed -i "s / måndag / dev /" idag [E-post skyddad]: ~ / Filer $ katt idag tisdag

Ampersand-symbolen kan användas för att referera till den önskade (och hittade) strängen.

I det här exemplet används Ampersand för att fördubbla antalet linjer som hittats. Echo måndag | Sed "s / monda / &&" måndag echo måndag | Sed "s / nik / && /" måndag

Runda fästen används för att gruppera delar av ett vanligt uttryck, vilket kan installeras därefter.

Tänk på följande exempel: [E-post skyddad]: ~ $ Echo söndag | Sed "s _ \\ (sun \\) _ \\ 1ny_" Sunnyday [E-post skyddad]: ~ $ Echo söndag | Sed "s _ \\ (sun \\) _ \\ 1ny \\ 1_" solig söndag

Peka på att ange någon symbol

Vid reguljärt uttryck kan en enkel punktsymbol ange något tecken. [E-post skyddad]: ~ $ Echo 2014-04-01 | sed "s /.... -..-../ yyyy-mm-dd /" yyyy-mm-dd [E-post skyddad]: ~ $ Echo abcd-ef-gh | sed "s /.... -..-../ yyyy-mm-dd /" yyyy-mm-dd

I fallet med mer än ett par runda parentes kan hänvisningen till var och en av dem utföras med hjälp av varandra numeriska värden. [E-post skyddad]: ~ $ Echo 2014-04-01 | Sed "s / \\ (.... \\) - \\ (.. \\) - \\ (.. \\) / \\ 1 + \\ 2 + \\ 3 /" 2014 + 04 + 01 [E-post skyddad]: ~ $ Echo 2014-04-01 | Sed "s / \\ (.... \\) - \\ (.. \\) - \\ (.. \\) / \\ 3: \\ 2: \\ 1 /" 01: 04: 2014

Den här funktionen heter Grouping.

Plats

Symbolsekvensen \\ s kan användas för att referera till en sådan symbol som en mellanslag eller fliksymbol.

Detta exempel ger en global sekvenssekvenser av gapsymboler (\\ s), som ersätts med 1 rymdfarkoster. [E-post skyddad]: ~ $ echo -e "idag \\ title \\ td" idag är en varm dag [E-post skyddad]: ~ $ echo -e "idag \\ trade \\ tdn" | sed "s_ \\ s_g" idag en varm dag

Valfria poster

Frågetecken symbolen indikerar att den föregående symbolen är valfri.

I exemplet nedan söker en sekvens av tre tecken o, och det tredje tecknet o är valfritt. [E-post skyddad]: ~ $ Kattlista2 ll lol lool loool [E-post skyddad]: ~ $ Grep -e "ooo?" List2 Lool Loool. [E-post skyddad]: ~ $ Cat List2 | Sed "s / ooo \\? / A /" ll lol lal lal

Exakt n repetitions

Du kan ange det exakta antalet repetitioner av föregående symbol.

Detta exempel söker efter rader med exakt tre symboler O. [E-post skyddad]: ~ $ Kattlista2 ll lol lool loool [E-post skyddad]: ~ $ Grep -e "o (3)" lista2 loool [E-post skyddad]: ~ $ Cat List2 | Sed "s / o \\ (3 \\) / a /" ll lol lool lal [E-post skyddad]:~$

Från n till m repetition

Och i det här exemplet indikerar vi tydligt att symbolen måste upprepas från det lägsta (2) till det maximala (3) antalet gånger. [E-post skyddad]: ~ $ Kattlista2 ll lol lool loool [E-post skyddad]: ~ $ Grep -e "o (2.3)" list2 lool loool [E-post skyddad]: ~ $ Grep "o \\ (2,3 \\)" list2 lool loool [E-post skyddad]: ~ $ Cat List2 | Sed "s / o \\ (2,3 \\) / a /" ll lol lal lal [E-post skyddad]:~$

Bash Command Shell History

Bash Command Shell kan också tolka några vanliga uttryck.

Detta exempel visar en manipuleringsteknik med ett utropstecken som en del av en sökmask i Bash Command Shell History. [E-post skyddad]: ~ $ Mkdir hist [E-post skyddad]: ~ $ CD hist / [E-post skyddad]: ~ / Hist $ touch file1 file2 file3 [E-post skyddad]: ~ / Hist $ ls -l file1 -rw-r - r-- 1 Paul Paul 0 april 15 22:07 File1 [E-post skyddad]: ~ / Hist $! L ls -l File1 -Rw-R - R-- 1 Paul Paul 0 april 15 22:07 File1 [E-post skyddad]: ~ / Hist $! L: S / 1/3 LS -L File3 -RW-R - R-- 1 Paul Paul 0 april 15 22:07 File3 [E-post skyddad]: ~ / Hist $

Denna teknik fungerar också vid användningen av siffror när du läser kommandot Bash Command Shell. [E-post skyddad]: ~ / Hist $ HISTORY 6 2089 MKDIR HIST 2090 CD HIST / 2091 Tryck på filen1 fil2 fil3 2092 LS -L File1 2093 LS -L File3 2094 Historia 6 [E-post skyddad]: ~ / Hist $! 2092 LS -L File1 -RW-R - R-- 1 Paul Paul 0 april 15 22:07 File1 [E-post skyddad]: ~ / Hist $! 2092: s / 1/2 ls -l file2 -rw-r - r-- 1 Paul Paul 0 april 15 22:07 File2 [E-post skyddad]: ~ / Hist $

För att helt bearbeta texter i bash-skript med sed och awk är det helt enkelt nödvändigt att hantera regelbundna uttryck. Genomförandet av detta användbara verktyg kan hittas bokstavligen överallt, och även om alla reguljära uttryck används, baserat på samma idéer, har arbetet med dem vissa funktioner i olika miljöer. Här kommer vi att prata om reguljära uttryck som är lämpliga för användning i scenarier. kommandorad Linux.

Detta material är uppfattat som en introduktion till vanliga uttryck, utformade för dem som absolut inte kan veta vad det är. Start, börja från början.

Vad är vanliga uttryck

För många, när de först ser regelbundna uttryck, uppstår idén omedelbart att det inte finns något meningslöst lurge av tecken. Men det är naturligtvis långt borta. Ta en titt, till exempel på detta vanliga uttryck


Enligt vår uppfattning kommer även en absolut nybörjare att förstå hur det fungerar och varför det är nödvändigt :) Om du inte förstår, läs bara längre och allt kommer att falla på plats.
Regelbundet uttryck är en mall som använder programmen som sed eller awk filtertexter. I mallar, konventionella ASCII-tecken som representerar sig, och de så kallade metasimlisterna, som till exempel spelar en särskild roll, till exempel, så att du kan hänvisa till några grupper av tecken.

Typer av regelbundna uttryck

Genomförande av regelbundna uttryck i olika miljöer, till exempel, i programmeringsspråk som Java, Perl och Python, i Linux-verktyg som SED, AWK och GREP, har vissa funktioner. Dessa funktioner beror på de så kallade motorbehandlingsmotorerna, som är engagerade i tolkning av mallar.
Linux har två vanliga uttrycksmotorer:
  • Motorn som stöder POSIX Basic Regular Expression (BRE) -standarden.
  • Motorn som stöder POSIX Extended Regular Expression (ERE) standard.
De flesta Linux-verktyg motsvarar åtminstone standard Posix BRE, men vissa verktyg (bland dem) förstår endast en viss delmängd av BRE-standarden. En av anledningarna till en sådan begränsning är en önskan att göra sådana verktyg så snabbt som möjligt i textbehandling.

Posix ERE-standarden är ofta implementerad i programmeringsspråk. Det låter dig använda ett stort antal medel när du utvecklar regelbundna uttryck. Till exempel kan det vara specialtecken sekvenser för ofta använda mönster, som sökning i texten. separata ord eller siffror uppsättningar. AWK stöder ERE-standarden.

Det finns många sätt att utveckla regelbundna uttryck beroende på programmatörens åsikt och på funktionerna i motorn, som skapas av dem. Det är inte lätt att skriva universella reguljära uttryck som kan förstå någon motor. Därför kommer vi att fokusera på de vanligaste regelbundna uttrycken och överväga funktionerna i deras genomförande för SED och AWK.

Regelbundna uttryck Posix Bre

Kanske är den enklaste BRE-mallen ett vanligt uttryck för att söka efter noggrann sekvens av symboler i texten. Här är vad sökandet efter strängen i sed och awk ser ut som:

$ Echo "Detta är ett test" | SED -N "/ Test / P" $ echo "Detta är ett test" | AWK "/ TEST / (Skriv ut $ 0)"

Sök text efter mall i sed


Textsökning efter mall i AWK

Det kan noteras att sökandet efter en angiven mall utförs utan att ta hänsyn till den exakta platsen för texten i strängen. Dessutom spelar antalet händelser inte roll. Efter det att det vanliga uttrycket finner den angivna texten någonstans i strängen anses strängen lämplig och överföras för vidare bearbetning.

Att arbeta med regelbundna uttryck måste beaktas att de är känsliga för teckenregistret:

$ Echo "Detta är ett test" | AWK "/ TEST / (PRINT $ 0)" $ ECHO "Detta är ett test" | AWK "/ TEST / (Skriv ut $ 0)"

Regelbundna uttryck är känsliga för registrering

Det första reguljära uttrycket av coimidenser hittade inte, eftersom ordet "test", som börjar med huvudbokstaven, inte uppstår i texten. Den andra, konfigurerad att söka efter ordet skrivet av stora bokstäver, hittade en lämplig sträng i strömmen.

I reguljära uttryck är det inte bara bokstäver, utan även utrymmen och siffror:

$ Echo "Detta är ett test 2 igen" | AWK "/ Test 2 / (Skriv ut $ 0)"

Sök efter ett fragment av text som innehåller mellanslag och siffror

Mellanslag uppfattas av motorn av vanliga uttryck som vanliga tecken.

Särskilda symboler

Vid användning av olika symboler i regelbundna uttryck bör vissa funktioner beaktas. Så det finns några speciella symboler, eller metakarakter, vars användning i mallen kräver ett speciellt tillvägagångssätt. Här är de:

.*^${}\+?|()
Om en av dem behövs i mallen måste den vara avskärmad med hjälp av en omvänd fläta (omvänd slash) - \\.

Till exempel, om texten du behöver hitta ett dollartecken, måste den vara påslagen i mallen, efter skärmsymbolen. Säg, det finns en myfile-fil med sådan text:

Det finns $ 10 på min ficka
Dollarnsignalen kan detekteras med en sådan mall:

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

Använd i en speciell symbolmall

Dessutom är den omvända sjunkande linjen också en speciell symbol, så om du behöver använda den i mallen måste det också vara avskärmat. Det ser ut som två snedstreck, går till varandra:

$ Echo "\\ är ett speciellt tecken" | AWK "/ \\\\ / (Skriv ut $ 0)"

Shielding Reverse Slash

Även om det direkta snedstrecket inte ingår i listan över specialtecken ovan, kommer ett försök att använda dem i regelbundet uttryck som skrivs för SED eller AWK, att resultera i fel:

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

Felaktig användning av direkt snedstreck i mallen

Om det behövs ska det också skyddas:

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

Skärmning direkt snedstreck

Ankare symboler

Det finns två specialtecken för att binda mallen till början eller i slutet av textsträngen. Med "Cover" -symbolen - ^ kan du beskriva sekvenserna för de tecken som är i början av textsträngarna. Om det önskade mönstret är i ett annat ställe i strängen, svarar det vanliga uttrycket inte på det. Det ser ut som den här symbolen så här:

$ Echo "Välkommen till LikeEeks webbplats" | AWK "/ ^ LikeEeks / (Skriv ut $ 0)" $ echo "LikeEeks webbplats" | AWK "/ ^ LikeEeks / (Skriv ut $ 0)"

Mallsökning i början av linjen

^ Symbolen är utformad för att söka efter en mall i början av linjen, medan tecknen av tecken också beaktas. Låt oss se hur detta kommer att påverka bearbetningen textfil:

$ AWK "/ ^ This / (Print $ 0)" MyFile


Mallsökning i början av raden i texten från filen

När du använder sed, om du lägger locket var som helst i mallen, kommer det att uppfattas som någon annan konventionell symbol:

$ Echo "Detta ^ är ett test" | Sed -n "/ s ^ / p"

Omslaget som inte är i början av mallen i sed

I AWK, när du använder samma mall, bör denna karaktär vara avskärmad:

$ Echo "Detta ^ är ett test" | AWK "/ s \\ ^ / (Skriv ut $ 0)"

Omslaget som inte är i början av mallen i AWK

Med sökning efter textfragment räknade vi ut i början av linjen. Vad händer om du behöver hitta något som ligger i slutet av raden?

Detta hjälper oss ett dollar tecken - $, vilket är ett ankare strängändsymbol:

$ Echo "Detta är ett test" | AWK "/ TEST $ / (Skriv ut $ 0)"

Textsökning i slutet av strängen

I samma mall kan du använda båda ankarsymbolerna. Vi kommer att utföra behandlingen av myfilefilen, vars innehåll visas i figuren nedan, med användning av ett sådant reguljärt uttryck:

$ AWK "/ ^ Det här är ett test $ / (Skriv ut $ 0)" MyFile


Mall där speciella start- och slutsymboler används

Som det kan ses, reagerades mallen endast på en sträng som är helt lämplig specificerad sekvens tecken och deras plats.

Så här använder du ankarsymboler, filter tomma linjer:

$ AWK "! / ^ $ / (Skriv ut $ 0)" MyFile
I den här mallen använde en symbol för att förneka ett utropstecken -! . Genom användningen av en sådan mall, finns det en sökning efter linjer som inte innehåller något mellan början och slutet av linjen, och utropstecken Endast linjer som inte motsvarar den här mallen visas.

Symbol "punkt"

Poängen används för att söka efter en enda symbol, med undantag av radöversättningssymbolen. Låt oss ge en sådan regelbunden uttryck Myfile-fil, vars innehåll visas nedan:

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


Med hjälp av en punkt i vanliga uttryck

Som framgår av den visade data, motsvarar mallen endast de två första raderna från filen, eftersom de innehåller en sekvens av "ST" -tecken, som låtsas av en annan symbol, medan den tredje linjen av lämplig sekvens inte innehåller , och i den fjärde är det, men är i början av linjen.

Klasser av symboler

Poängen motsvarar någon enda symbol, men vad händer om du behöver mer flexibelt begränsa uppsättningen av önskade tecken? I en sådan situation kan du använda klasserna av tecken.

Tack vare detta tillvägagångssätt kan du organisera sökningen efter något tecken från den angivna uppsättningen. Kvadratkonsoler används för att beskriva karaktärsklassen av tecken -:

$ AWK "/ TH / (Skriv ut $ 0)" MyFile


Beskrivning av klassen av tecken i vanliga termer

Här letar vi efter sekvensen av karaktärerna "th", framför vilken det finns en symbol "o" eller symbolen "jag".

Klasser visar sig vara mycket välkomna om sökandet efter ord som kan börja både från kapital och små bokstäver utförs:

$ Echo "Detta är ett test" | AWK "/ His är ett test / (Skriv ut $ 0)" $ echo "Detta är ett test" | Awk "/ hans är ett test / (Skriv ut $ 0)"

Hitta ord som kan börja med en liten bokstav eller bokstav

Teckenklasser är inte begränsade till bokstäver. Här kan du använda andra tecken. Det är omöjligt att i förväg säga, i vilka situationer som klasser behöver - det beror allt på att uppgiften är löst.

Förnekelse av klasser av symboler

Teckenklasser kan också användas för att lösa den ovan beskrivna uppgiften. Namnlösa: I stället för att hitta de tecken som ingår i klassrummet kan du organisera sökandet efter allt som inte ingår i klassen. För att uppnå ett sådant beteende av ett regelbundet uttryck, innan listan över klassstecken behöver du placera ett tecken ^. Det ser ut så här:

$ AWK "/ [^ OI] th / (Skriv ut $ 0)" Myfile


Sök efter symboler som inte ingår i klassen

I det här fallet kommer sekvenserna av tecknen "th", innan det inte finns något "o" eller "jag".

Symbolband

I symboliska klasser kan du beskriva tecknen med tecken med ett streck:

$ AWK "/ ST / (Skriv ut $ 0)" MyFile


Beskrivning av symbolområdet i den symboliska klassen

I det här exemplet svarar det vanliga uttrycket på sekvensen av "ST" -symboler, framför vilken det finns någon symbol som finns i alfabetisk ordning mellan tecknen "E" och "P".

Ranges kan skapas från nummer:

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

Regelbundet uttryck för att söka efter tre några nummer

Symbolklassen kan innehålla flera intervall:

$ AWK "/ ST / (Skriv ut $ 0)" MyFile


Symbolklass bestående av flera intervall

Detta vanliga uttryck hittar alla "ST" -sekvenser, framför vilken det finns symboler från A-F och M-Z-band.

Speciella klasser av symboler

Bre har specialtecken klasser som kan användas när man skriver regelbundna uttryck:
  • [[: Alpha:]] - motsvarar vilken alfabetisk symbol som spelats in i det övre eller nedre registret.
  • [[: Alnum:]] - Motsvarar vilken alfanumerisk symbol som helst, nämligen symbolerna i intervallet 0-9, A-Z, A-Z.
  • [[: Blank:]] - Motsvarar gapet och fliken på fliken.
  • [[: Digit:]] - Alla digitala symboler från 0 till 9.
  • [[: Övre:]] - Alfabetiska tecken i det stora fallet - A-Z.
  • [[: Nedre:]] - Alfabetiska tecken i små bokstäver - A-Z.
  • [[: Skriv ut:]] - Motsvarar någon tryckt symbol.
  • [[: Punct:]] - motsvarar skiljetecken.
  • [[: Utrymme:]] - blinda tecken, i synnerhet - utrymme, flikskylt, symboler nl, ff, vt, cr.
Använd speciella klasser i mallar så här:

$ Echo "abc" | AWK "/ [[: ALPHA:]] / (Skriv ut $ 0)" $ echo "ABC" | AWK "/ [[: Digit:]] / (Skriv ut $ 0)" $ echo "ABC123" | AWK "/ [[: Digit:]] / (Skriv ut $ 0)"


Särskilda klasser av symboler i reguljära uttryck

Symbol "stjärna"

Om i mallen efter symbolen, satte stjärnan, betyder det att det vanliga uttrycket kommer att fungera om symbolen visas i raden ett antal gånger - inklusive situationen när tecknet i linjen saknas.

$ Echo "test" | AWK "/ TES * T / (Skriv ut $ 0)" $ ECHO "TESSST" | AWK "/ TES * T / (Skriv ut $ 0)"


Använda en symbol * i reguljära uttryck

Denna mallsymbol brukar användas för att arbeta med ord i vilka typsnitt eller för ord som tillåter olika alternativ för stavning:

$ Echo "Jag gillar grön färg" | AWK "/ COLOU * R / (Skriv ut $ 0)" $ echo "Jag gillar grön färg" | AWK "/ COLOU * R / (Skriv ut $ 0)"

Sökord med olika skrivalternativ

I det här exemplet reagerar samma regelbundna uttryck på ordet "färg" och ordet "färg". Det är så tack vare det faktum att symbolen "U", varefter stjärnorna står, kan antingen vara frånvarande eller förekommer flera gånger i rad.

En annan användbar möjlighet som uppstår på grund av egenskaperna hos stjärnorna är att kombinera den med en punkt. En sådan kombination möjliggör regelbundet uttryck att svara på vilket antal som helst:

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


Mall som reagerar på ett antal av några tecken

I det här fallet, oavsett hur många tecken är mellan orden "detta" och "test".

Stjärnorna kan användas med symbolklasser:

$ Echo "st" | AWK "/ S * T / (Skriv ut $ 0)" $ ECHO "SAT" | AWK "/ S * T / (Skriv ut $ 0)" $ echo "set" | AWK "/ S * T / (Skriv ut $ 0)"


Använda stjärnor med symbolklasser

I alla tre exempel utlöses det vanliga uttrycket, eftersom stjärnorna efter klass av tecken betyder att om ett antal tecken "A" eller "E" finns, och om de inte kan hittas, matchar strängen den angivna mallen.

Regelbundna POSIX ERE-uttryck

Mall pOSIX-standard ERE, som stöder vissa Linux-verktyg kan innehålla ytterligare tecken. Som redan nämnts stöder AWK denna standard, men sed är inte.

Här kommer vi att titta på de vanligaste symbolerna som kommer att vara användbara för dig när du skapar egna vanliga uttryck.

▍Shisant tecken

Frågetecken indikerar att den föregående symbolen kan träffas i texten en gång eller inte uppfylla alls. Denna symbol är en av metasimvolerna av repetitioner. Här är några exempel:

$ Echo "tet" | AWK "/ TES? T / (Skriv ut $ 0)" $ ECHO "TEST" | AWK "/ TES? T / (Skriv ut $ 0)" $ ECHO "TESST" | AWK "/ TES? T / (Skriv ut $ 0)"


Frågetecken i regelbundna uttryck

Som det kan ses, i det tredje fallet, uppfyller bokstaven "S" två gånger, så ordet "TESST" svarar inte regelbundet uttryck.

Frågetecken kan användas med symbolklasser:

$ Echo "tst" | AWK "/ T? ST / (Skriv ut $ 0)" $ ECHO "TEST" | AWK "/ T? ST / (Skriv ut $ 0)" $ ECHO "TAST" | AWK "/ T? ST / (Skriv ut $ 0)" $ echo "taest" | AWK "/ T? ST / (Skriv ut $ 0)" $ ECHO "TEEST" | AWK "/ T? ST / (Skriv ut $ 0)"


Frågetecken och symbolklasser

Om det inte finns några tecken från en klass i rad, eller en av dem inträffar en gång, utlöses det vanliga uttrycket, men det är nödvändigt att visas två tecken och systemet hittar inte längre i textens matchande text.

▍simol "plus"

Plus-symbolen i mallen indikerar att det vanliga uttrycket kommer att detektera det önskade om den föregående symbolen kommer att träffas i texten en eller flera gånger. Samtidigt kommer det inte att finnas någon sådan design om frånvaro av en symbol:

$ Echo "test" | AWK "/ TE + ST / (PRINT $ 0)" $ ECHO "TEEST" | AWK "/ TE + ST / (PRINT $ 0)" $ ECHO "TST" | AWK "/ TE + ST / (Skriv ut $ 0)"


Symbolen för "plus" i reguljära uttryck

I det här exemplet, om det inte finns någon "E" -symbol i ordet, hittar motorn av vanliga uttryck inte mallen i textens matchande text. Symbolen för "plus" fungerar och med klasserna av symboler - det här liknar klistermärken och frågetecken:

$ Echo "tst" | AWK "/ T + ST / (Skriv ut $ 0)" $ ECHO "TEST" | AWK "/ T + ST / (Skriv ut $ 0)" $ ECHO "TEAST" | AWK "/ T + ST / (Skriv ut $ 0)" $ ECHO "TEEAST" | AWK "/ T + ST / (Skriv ut $ 0)"


Plus tecken och symbolklasser

I det här fallet, om det finns några tecken från klassen i linjen, kommer texten att detekteras av lämpligt mönster.

▍Figure parentes

Figurer som kan användas i ERE-mallar liknar de symboler som diskuterats ovan, men de tillåter dig att noggrant ställa in det nödvändiga antalet poster av symbolen tidigare. Du kan ange begränsningen i två format:
  • n är ett tal som anger det exakta antalet önskade poster
  • n, m - två nummer som tolkas enligt följande: "Åtminstone n gånger, men inte mer än M."
Här är exempel på det första alternativet:

$ Echo "tst" | AWK "/ TE (1) ST / (Skriv ut $ 0)" $ ECHO "TEST" | AWK "/ TE (1) ST / (Skriv ut $ 0)"

Figurerade fästen i mallar, sök efter ett exakt antal förekomster

I de gamla versionerna av AWK var det nödvändigt att använda kommandoradsnyckel - intervallet för att programmet ska kunna känna igen intervallen i regelbundna uttryck, men det är inte nödvändigt att göra detta i nya versioner.

$ Echo "tst" | AWK "/ TE (1,2) ST / (Skriv ut $ 0)" $ ECHO "TEST" | AWK "/ TE (1,2) ST / (Skriv ut $ 0)" $ ECHO "TEEST" | AWK "/ TE (1,2) ST / (Skriv ut $ 0)" $ ECHO "TEEST" | AWK "/ TE (1,2) ST / (Skriv ut $ 0)"


MACOBA-intervall

I det här exemplet bör symbolen "E" mötas i en sträng på 1 eller 2 gånger, då det vanliga uttrycket svarar på texten.

Figurerade fästen kan användas med symbolklasser. Här är redan bekant för dig Principer:

$ Echo "tst" | AWK "/ T (1,2) ST / (Skriv ut $ 0)" $ ECHO "TEST" | AWK "/ T (1,2) ST / (Skriv ut $ 0)" $ ECHO "TEEST" | AWK "/ T (1,2) ST / (Skriv ut $ 0)" $ ECHO "TEEAST" | AWK "/ T (1,2) ST / (Skriv ut $ 0)"


Stora fästen och symbolklasser

Mallen svarar på texten om den kommer att uppfylla "A" -symbolen eller "E" -symbolen.

▍mimvivo logiska "eller"

Symbol | - Vertikalt drag, medel i regelbundna uttryck en logisk "eller". Bearbetning av ett reguljärt uttryck innehållande flera fragment separerade med ett sådant tecken, kommer motorn att överväga den analyserade texten som är lämplig i händelse av att den kommer att motsvara någon av fragmenten. Här är ett exempel:

$ Echo "Detta är ett test" | AWK "/ TEST | EXAM / (PRINT $ 0)" $ ECHO "Detta är en tentamen" | AWK "/ Test | Exam / (Skriv ut $ 0)" $ echo "Detta är något annat" | AWK "/ TEST | Exam / (Skriv ut $ 0)"


Logisk "eller" i reguljära uttryck

I det här exemplet är ett vanligt uttryck konfigurerat att söka i texten i orden "Test" eller "Exam". Observera att mellan mallfragment och deras delningssymbol | Det borde inte finnas några luckor.

Fragment av vanliga uttryck kan grupperas med hjälp av runda fästen. Om en viss sekvens av tecken är grupperad, kommer den att uppfattas av systemet som en normal symbol. Det är till exempel möjligt att tillämpa metakaracterna av repetitioner. Här är hur det ser ut:

$ Echo "som" | AWK "/ Gilla (Geeks)? / (Skriv ut $ 0)" $ echo "LikeEeks" | AWK "/ Gilla (Geeks)? / (Skriv ut $ 0)"


Gruppering av fragment av vanliga uttryck

I dessa exempel är ordet "geeks" inneslutet i runda parentes, efter det här designen finns ett frågetecken. Minns att frågetecknet betyder "0 eller 1 repetition", som ett resultat, kommer det reguljära uttrycket att reagera på den "som" -strängen, och på Likedegeeks-strängen.

Praktiska exempel

När vi demonterar grunden för regelbundna uttryck, är det dags att göra något användbart med dem.

▍ Antalet filer

Skriv ett bash-skript som räknar filerna i de kataloger som spelas in i variabel miljö Väg. För att göra detta måste du börja, bilda en lista med sätt på kataloger. Låt oss göra det med sed, ersätta kolon på mellanslag:

$ Echo $ väg | SED "S /: / / G"
Byte-kommandot stöder regelbundna uttryck som mallar för att söka efter text. I det här fallet är allt extremt enkelt, vi letar efter en kolonymbol, men ingen stör det att använda här och något annat - allt beror på den specifika uppgiften.
Nu måste du gå igenom listan som tas emot i slingan och utföra antalet åtgärdsfiler som är nödvändiga för beräkningen. Det allmänna skriptsystemet kommer att vara så här:

MyPath \u003d $ (Echo $ Path | SED "S /: / / G") för katalog i $ MyPath gör en
Skriv nu den fullständiga texten i skriptet med hjälp av LS-kommandot för att få information om antalet filer i var och en av katalogen:

#! / BIN / BASH MYPATH \u003d $ (Echo $ Path | SED "S /: / / G") COUNT \u003d 0 för katalog i $ MyPath Do Check \u003d $ (LS $ Directory) för objekt i $ check räknas \u003d $ [$ Count + 1] Klar echo "$ Directory - $ count" count \u003d 0 gjort
När du startar skriptet kan det visa sig att vissa kataloger från sökvägen inte existerar, men hindrar inte honom från att beräkna filer i befintliga styrelseledamöter.


Räkna filer

Huvudvärdet av det här exemplet är att med samma tillvägagångssätt kan du lösa mycket mer komplexa uppgifter. Vad exakt - beror på dina behov.

▍ Kontrollera e-postadresser

Det finns webbplatser med stora samlingar av vanliga uttryck som gör att du kan kontrollera adresser e-post, telefonnummer, och så vidare. Men en sak är att göra redo, och en annan annan - skapa något själv. Skriv därför ett vanligt uttryck för att kontrollera e-postadresser. Låt oss börja med analysen av källdata. Här, till exempel, en viss adress:

[E-post skyddad]
Användarnamnet, användarnamnet, kan bestå av alfanumeriska och några andra tecken. Namnlösa är det en prick, bindestreck, en symbol för vidhäftningen, plusskylten. Bakom användarnamnet ska underteckna @.

Beväpnad med dessa kunskaper, låt oss börja montera ett vanligt uttryck från sin vänstra del, vilket tjänar till att kontrollera användarnamnet. Det var vad vi gjorde:

^(+)@
Detta regelbundna uttryck kan hittas som följer: "I början av linjen måste det finnas minst ett tecken från de som finns i gruppen som anges i kvadratkonsoler, och därefter ska @ -tecknet gå.

Nu - namnet på värdnamnet - värdnamn. Samma regler är tillämpliga här som för användarnamnet, så mallen för det kommer att se ut så här:

(+)
domän namn högsta nivån Obeys specialregler. Det kan bara vara alfabetiska tecken som bör vara minst två (till exempel innehåller sådana domäner vanligtvis landskoden) och högst fem. Allt detta innebär att mallen för att kontrollera den sista delen av adressen kommer att vara:

\.({2,5})$
Du kan läsa det så här: "Du måste först vara en punkt, sedan - från 2 till 5 alfabetiska tecken, och därefter slutar linjen."

Förbered mallar för enskilda delar av ett vanligt uttryck, samlar vi dem ihop:

^(+)@(+)\.({2,5})$
Nu är det bara att testa vad som hände:

$ echo " [E-post skyddad]"| AWK" / ^ (+) @ (+) \\. ((2,5) $$ / (Skriv ut $ 0) "$ echo" [E-post skyddad]"| AWK" / ^ (+) @ (+) \\. ((2,5) $ 0) "/ (Skriv ut $ 0)"


Kontrollera e-postadress med vanliga uttryck

Det faktum att den överförda AWK-texten visas på skärmen innebär att systemet igenkänt e-postadressen i den.

RESULTAT

Om ett vanligt uttryck för att kontrollera e-postadresser, som möttes i början av artikeln, verkade det helt oförståeligt, förhoppningsvis, nu ser det inte ut som en meningslös uppsättning tecken. Om detta är sant - det betyder att detta material har uppfyllt sin destination. Faktum är att regelbundna uttryck är ett ämne som kan vara engagerade i allt liv, men även den lilla vi demonterade, det är redan möjligt att hjälpa dig med skrivskript som är ganska avancerade texter.

I denna serie av material visade vi vanligtvis mycket enkla exempel Bash-skript som bestod av bokstavligen från flera linjer. Nästa gång betraktar vi något mer storskaligt.

Kära läsare! Använder du regelbundna uttryck när du bearbetar texter i kommandoradsskript?

Bra tid, gäster!

I dagens artikel vill jag röra ett så stort ämne som Vanliga uttryck. Jag tror att alla vet att ämnet för Regquins (så vanliga uttryck kallas i slang) - enorm i mängden ett inlägg. Därför kommer jag att försöka kort, men som du kan förstå hur man samlar mina tankar i ett gäng och förmedlar dem till dig.

Jag börjar med det faktum att det finns flera sorter av regelbundna uttryck:

1. Traditionella reguljära uttryck (de är grundläggande, grundläggande och grundläggande reguljära uttryck (Bre))

  • syntaxen för dessa uttryck definieras som föråldrad, men ändå är fortfarande utbredd och används av många UNIX-verktyg
  • De viktigaste reguljära uttrycken inkluderar följande metasimwoler (om deras värden nedan):
    • \\ (\\) - det ursprungliga alternativet för () (i avancerad)
    • \\ (\\) - det ursprungliga alternativet för () (i avancerad)
    • \n. var n. - Nummer från 1 till 9
  • Funktioner för att använda data metasimvols:
    • Star måste följa efter ett uttryck som motsvarar en enda symbol. Exempel: *.
    • Uttryck \\ ( blockera\\) * Det bör anses vara fel. I vissa fall motsvarar det noll eller flera repetitioner blockera . I andra motsvarar det strängen blockera* .
    • Inuti den symboliska klassen ignoreras speciella teckenvärden huvudsakligen. Speciella fall:
    • För att lägga till en symbol ^ i en uppsättning ska den placeras där inte först.
    • För att lägga till en symbol för uppsättningen ska den placeras där först eller sist. Till exempel:
      • dNS-namngiven mall där bokstäver, siffror, minus och punktseparator kan innefatta: [-0-9A-ZA-Z.];
      • alla tecken, förutom minus och siffror: [^ -0-9].
    • För att lägga till en [eller] -symbol för uppsättningen ska den placeras där först. Till exempel:
      • motsvarar], [, a eller b.

2. Utökade vanliga uttryck (dom är utökade vanliga uttryck (Ere))

  • Syntaxen för dessa uttryck liknar syntaxen för de viktigaste uttrycken, förutom:
    • Avbrutet användningen av omvänd flätlinje för metasimvols () och ().
    • Den omvända sjunkande linjen framför metacimolen avbryts sin speciella betydelse.
    • Avvisade teoretiskt oregelbunden design \\ n. .
    • Tillagd Metacimol + ,? , | .

3. Regelbundna uttryck som är kompatibla med perl(dom är Perl-kompatibla reguljära uttryck (PCRE))

  • ha en rikare och samtidigt förutsägbar syntax än även Posix ERE, så används applikationer ofta.

Vanliga uttryck bestå avmall Ange mallen Sök. Mönstret består av reglersök, som är sammanställda från symboleroch metasimvolov.

Sökregler Definieras som följer operationer:

Notering |

Vertikalt drag (|) Delar de tillåtna alternativen, man kan säga - logisk eller. Till exempel, "grå | grå" motsvarar grå. eller grå..

Gruppering eller fackförening ()

Runda fästen Brukade bestämma verksamhetsområdet och prioritet hos operatörerna. Till exempel, "grå | grå" och "gr (a | e) y" är olika prover, men de beskriver båda en uppsättning som innehåller grå. och grå..

Kvantifiering ()? * +.

Kvantifierare Efter en symbol eller en grupp bestämmer hur många gånger tidigareuttrycket kan uppstå.

allmänt uttryck, repetitioner kan vara från m till n inklusive.

allmän uttryck m och mer repetitioner.

allmän uttryck inte mer än n repetition.

slät n repetitions.

Frågeteckeninnebär att 0 eller 1. gånger detsamma som {0,1} . Till exempel motsvarar "COLOU? R" färg, I. färg..

Stjärnainnebär att 0, 1 eller något nummer En gång ( {0,} ). Till exempel motsvarar "Go * Gle" gegel, gogle., google och så vidare.

Ett plusinnebär att minst 1. En gång ( {1,} ). Till exempel, "go + gle" matcher gogle., google etc. (men inte gegel).

Den specifika syntaxen för dessa reguljära uttryck beror på genomförandet. (det vill säga i grundläggande reguljära uttryck Symboler (och)- Skärmad backlash)

MetactersAv helt enkelt är det symboler som inte matchar sitt verkliga värde, det vill säga en symbol. (punkt) är inte en punkt, men något tecken etc. Vänligen bli bekant med metasimvols och deras värderingar:

. överensstämma med ettnågon symbol
[något] Överensstämma med någonsymbol från antalet fångar i parentes. Samtidigt: "-" -symbolen tolkas bokstavligen endast om den är placerad direkt efter öppningen eller framför stängningsfästet: eller [-ABC]. Annars betecknar den teckenintervall. Till exempel motsvarar "A", "B" eller "C". motsvarar bokstäverna i det latinska latinska alfabetet. Dessa beteckningar kan kombineras: motsvarar A, B, C, Q, R, S, T, U, V, W, X, Y, ZC för att fastställa korrespondensen av tecknen "[" eller "]", räcker Till den stängande konsolen var det det första tecknet efter öppning: motsvarar "]", "[", "A" eller "B". Om värdet i kvadratiska parentes presenterades med symbolen ^, motsvarar värdet av uttrycket till singelsymbol bland de som inte finns i parentes. Till exempel motsvarar [^ ABC] någon symbol förutom "A", "B" eller "C". [^ A-Z] motsvarar vilket tecken som helst, förutom symbolerna i det nedre registret i det latinska alfabetet.
^ Motsvarar början av texten (eller början av någon sträng om linjen är linjen).
$ Motsvarar slutet av texten (eller slutet av någon sträng om linjeläget).
\\ (\\) eller () Meddelar "namnet" (grupperat uttryck), som kan användas senare (se följande element: \\ n.). "Tillkännagivt prenumeration" är också ett "block". Till skillnad från andra operatörer kräver detta (i traditionell syntax) en Bexlesh, i en utökad och Perl-symbol \\ är inte nödvändig.
\n. Var n. - Detta är en figur från 1 till 9; överensstämma med n.-Till noterade hemma (till exempel (ABCD) \\ 0, det vill säga ABCD-tecken noteras av noll). Denna design teoretiskt oregelbundenHon accepterades inte i den avancerade syntaxen av reguljära uttryck.
*
  • Stjärnaefter det att uttrycket som motsvarar enhetsymbolen motsvarar noll-eller mer kopiorav detta (föregående) uttryck. Till exempel motsvarar "*" en tom sträng, "X", "Y", "ZX", "ZYX", etc.
  • \n.*, var n. - Detta är ett tal från 1 till 9, motsvarar noll eller flera poster för överensstämmelse. n.- En markant imitation. Till exempel motsvarar "\\ (a. \\) C \\ 1 *" "abcab" och "abcaba", men inte "abcac".

Uttrycket som avslutades i "\\ (" och "\\)" och åtföljd "*" bör anses vara felaktigt. I vissa fall motsvarar det noll eller mer förekomster av strängen som var innesluten i parentes. I andra motsvarar det uttrycket som är inneslutet i konsolen, med tanke på symbolen "*".

\{x.,y.\} Motsvarar den sista ( kommande) ett block som inträffar åtminstone x. och inte mer y. tid. Till exempel motsvarar "A \\ (3.5 \\)" "AAA", "AAAA" eller "AAAAA". Till skillnad från andra operatörer kräver detta (i traditionell syntax) en Bexlesh.
.* Beteckning av något antal tecken mellan två delar av det vanliga uttrycket.

Metasimwalls Vi hjälper till att använda olika överensstämmelse. Men hur man föreställer sig metacimum av den vanliga symbolen, det vill säga symbolen [(kvadratkonsolen) värdet på kvadratkonsolen? Helt enkelt:

  • måste förhindra ( skydda) Metacimol (. * + \\? ()) Backlash. Till exempel \\. eller \\ [

För att förenkla uppgiften för vissa teckenuppsättningar kombinerades de i den så kallade. klasser och kategorier av tecken. POSIX standardiserad deklaration av vissa klasser och kategorier av tecken, som visas i följande tabell:

Posixklass liknande beteckning
[: Övre:] symboler i övre registret
[: Lägre:] symboler i det nedre registret
[: Alpha:] symboler i det övre och undre registret
[: Alnum:] nummer, övre och nedre register symboler
[: Siffra:] tal
[: xDigit:] hexadecimala siffror
[: Punct:] [.,!?:…] tecken på interpunktion
[: Blank:] [\\ t] utrymme och flik.
[: Plats:] [\\ t \\ n \\ r \\ f \\ v] symboler av pass
[: Cntrl:] kontrollsymboler
[: Graf:] [^ \\ t \\ n \\ r \\ f \\ v] symboler för utskrift
[: Skriv ut:] [^ \\ t \\ n \\ r \\ f \\ v] skriv ut symboler och hoppa över symboler

Regex har en sådan sak som:

Regex girighet

Jag kommer att försöka beskriva så tydligt som möjligt. Antag att vi vill hitta allt HTML-taggar I någon text. Localled uppgiften, vi vill hitta värdena för fångarna mellan< и >, tillsammans med dessa klackar. Men vi vet att taggar har olika längd Och taggarna själva, minst 50 stycken. Lista dem alla, avslutande i Metacharativet - uppgiften är för tidskrävande. Men vi vet att vi har ett uttryck. * (Peka asterisk), kännetecknar ett antal tecken i strängen. Med detta uttryck kommer vi att försöka hitta i texten (

Så, Hur man skapar en 10/50 RAID på LSI MegaGaid Controller (relevant och för: Intel srcu42x, Intel srcs16):

) Alla värden mellan< и >. Som ett resultat kommer hela strängen att motsvara detta uttryck. Varför, för Remex - Zhaden och försöker fånga alla antal tecken mellan< и >, respektive hela linjen börjar < p\u003e Så, ...och efterbehandling ...> kommer att tillhöra denna regel!

Jag hoppas till exempel, det är klart vad girighet är. För att bli av med detta girighet kan du gå på nästa sätt:

  • ta hänsyn till tecknen inte Relevant önskat prov (till exempel:<[^>] *\u003e För det ovan beskrivna ärendet)
  • pålitlig från girighet genom att lägga till en kvantifieringsdefinition som oönskade:
    • *? - "inte girig" ("lat") ekvivalent *
    • +? - "inte girig" ("lat") ekvivalent +
    • (n,)? - "inte girig" ("lat") ekvivalent (n,)
    • . *? - "inte girig" ("lat") ekvivalent. *

Allt ovanstående vill komplettera syntaxen för utökade vanliga uttryck:

Regelbundna uttryck i POSIX liknar den traditionella UNIX-syntaxen, men med tillägg av vissa metasimvoler:

Ett plusindikerar att tidigaresymbol eller gruppkan upprepas en eller flera gånger. Till skillnad från stjärnorna krävs minst en repetition.

Frågetecken Gör. tidigaresymbolen eller gruppen är valfri. Med andra ord, i lämplig linje det kan vara frånvarande eller närvarande slät etttid.

Vertikal egenskapaktier alternativa alternativ Vanliga uttryck. Ett tecken ställer in två alternativ, men det kan finnas fler av dem, det är tillräckligt att använda mer vertikala skrik. Man måste komma ihåg att den här operatören använder den maximala möjliga delen av uttrycket. Av denna anledning används den alternativa operatören oftast inom parenteserna.

Det avbröts också användningen av omvänd flätan [... \\) blir (...) och \\ (... \\) blir (...).

I slutet av posten kommer jag att ge några exempel på att använda regex:

$ Katt text1 1 äpple 2 päron 3 banan $ grep text1 1 äpple 2 päron $ grep "pp *" text1 1 äpple 2 päron $ katt text1 | Grep "L \\ | N" 1 äpple 3 Banana $ echo -e "hitta en \\ n * här" | Grep "\\ *" * här $ grep "pl \\? * R" text1 # p, i linjer där det finns r 2 pear $ grep "a .." text1 # rader med a, följt av minst 2 symboler 1 äpple 3 Banan $ grep "" text1 # Sök efter linjer där det finns 3 eller p 1 äpple 2 päron 3 banan $ echo -e "hitta en \\ n * här \\ nsomewhere." | Grep "[. *]" * Här någonstans .. namn] $ echo -e "123 \\ n456 \\ n789 \\ n0" | grep "" 123 456 789 $ sed -e "/ (a. **) \\ | \\ (-p. * / a / s / a / a / g" text1 # ersättning och på och i alla linjer där efter och det går, eller efter p, p 1 äpple 2 päron 3 banan * \\ ./ sista word./g "först. Ett sista ord. Detta är ett sista ord.

Med vänliga hälsningar, mc.sim!

I dagens artikel vill jag röra ett så stort ämne som Vanliga uttryck. Jag tror att alla vet att ämnet för Regquins (så vanliga uttryck kallas i slang) - enorm i mängden ett inlägg.

Jag börjar med det faktum att det finns flera sorter av regelbundna uttryck:

1. Traditionella reguljära uttryck (de är grundläggande, grundläggande och grundläggande reguljära uttryck (Bre))

  • syntaxen för dessa uttryck definieras som föråldrad, men ändå är fortfarande utbredd och används av många UNIX-verktyg
  • De viktigaste reguljära uttrycken inkluderar följande metasimwoler (om deras värden nedan):
    • \\ (\\) - det ursprungliga alternativet för () (i avancerad)
    • \\ (\\) - det ursprungliga alternativet för () (i avancerad)
    • \n. var n. - Nummer från 1 till 9
  • Funktioner för att använda data metasimvols:
    • Star måste följa efter ett uttryck som motsvarar en enda symbol. Exempel: *.
    • Uttryck \\ ( blockera\\) * Det bör anses vara fel. I vissa fall motsvarar det noll eller flera repetitioner blockera . I andra motsvarar det strängen blockera* .
    • Inuti den symboliska klassen ignoreras speciella teckenvärden huvudsakligen. Speciella fall:
    • För att lägga till en symbol ^ i en uppsättning ska den placeras där inte först.
    • För att lägga till en symbol för uppsättningen ska den placeras där först eller sist. Till exempel:
      • dNS-namngiven mall där bokstäver, siffror, minus och punktseparator kan innefatta: [-0-9A-ZA-Z.];
      • alla tecken, förutom minus och siffror: [^ -0-9].
    • För att lägga till en [eller] -symbol för uppsättningen ska den placeras där först. Till exempel:
      • motsvarar], [, a eller b.

2. Utökade vanliga uttryck (dom är utökade vanliga uttryck (Ere))

  • Syntaxen för dessa uttryck liknar syntaxen för de viktigaste uttrycken, förutom:
    • Avbrutet användningen av omvänd flätlinje för metasimvols () och ().
    • Den omvända sjunkande linjen framför metacimolen avbryts sin speciella betydelse.
    • Avvisade teoretiskt oregelbunden design \\ n. .
    • Tillagd Metacimol + ,? , | .

3. Regelbundna uttryck som är kompatibla med perl(dom är Perl-kompatibla reguljära uttryck (PCRE))

  • ha en rikare och samtidigt förutsägbar syntax än även Posix ERE, så används applikationer ofta.

Vanliga uttryck bestå avmall Ange mallen Sök. Mönstret består av reglersök, som är sammanställda från symboleroch metasimvolov.

Sökregler Definieras som följer operationer:

Notering |

Vertikalt drag (|) Delar de tillåtna alternativen, man kan säga - logisk eller. Till exempel, "grå | grå" motsvarar grå. eller grå..

Gruppering eller fackförening ()

Runda fästen Brukade bestämma verksamhetsområdet och prioritet hos operatörerna. Till exempel, "grå | grå" och "gr (a | e) y" är olika prover, men de beskriver båda en uppsättning som innehåller grå. och grå..

Kvantifiering ()? * +.

Kvantifierare Efter en symbol eller en grupp bestämmer hur många gånger tidigareuttrycket kan uppstå.

allmänt uttryck, repetitioner kan vara från m till n inklusive.

allmän uttryck m och mer repetitioner.

allmän uttryck inte mer än n repetition.

slät n repetitions.

Frågeteckeninnebär att 0 eller 1. gånger detsamma som {0,1} . Till exempel motsvarar "COLOU? R" färg, I. färg..

Stjärnainnebär att 0, 1 eller något nummer En gång ( {0,} ). Till exempel motsvarar "Go * Gle" gegel, gogle., google och så vidare.

Ett plusinnebär att minst 1. En gång ( {1,} ). Till exempel, "go + gle" matcher gogle., google etc. (men inte gegel).

Den specifika syntaxen för dessa reguljära uttryck beror på genomförandet. (det vill säga i grundläggande reguljära uttryck Symboler (och)- Skärmad backlash)

MetactersAv helt enkelt är det symboler som inte matchar sitt verkliga värde, det vill säga en symbol. (punkt) är inte en punkt, men något tecken etc. Vänligen bli bekant med metasimvols och deras värderingar:

. överensstämma med ettnågon symbol
[något] Överensstämma med någonsymbol från antalet fångar i parentes. Samtidigt: "-" -symbolen tolkas bokstavligen endast om den är placerad direkt efter öppningen eller framför stängningsfästet: eller [-ABC]. Annars betecknar den teckenintervall. Till exempel motsvarar "A", "B" eller "C". motsvarar bokstäverna i det latinska latinska alfabetet. Dessa beteckningar kan kombineras: motsvarar A, B, C, Q, R, S, T, U, V, W, X, Y, ZC för att fastställa korrespondensen av tecknen "[" eller "]", räcker Till den stängande konsolen var det det första tecknet efter öppning: motsvarar "]", "[", "A" eller "B". Om värdet i kvadratiska parentes presenterades med symbolen ^, motsvarar värdet av uttrycket till singelsymbol bland de som inte finns i parentes. Till exempel motsvarar [^ ABC] någon symbol förutom "A", "B" eller "C". [^ A-Z] motsvarar vilket tecken som helst, förutom symbolerna i det nedre registret i det latinska alfabetet.
^ Motsvarar början av texten (eller början av någon sträng om linjen är linjen).
$ Motsvarar slutet av texten (eller slutet av någon sträng om linjeläget).
\\ (\\) eller () Meddelar "namnet" (grupperat uttryck), som kan användas senare (se följande element: \\ n.). "Tillkännagivt prenumeration" är också ett "block". Till skillnad från andra operatörer kräver detta (i traditionell syntax) en Bexlesh, i en utökad och Perl-symbol \\ är inte nödvändig.
\n. Var n. - Detta är en figur från 1 till 9; överensstämma med n.-Till noterade hemma (till exempel (ABCD) \\ 0, det vill säga ABCD-tecken noteras av noll). Denna design teoretiskt oregelbundenHon accepterades inte i den avancerade syntaxen av reguljära uttryck.
*
  • Stjärnaefter det att uttrycket som motsvarar enhetsymbolen motsvarar noll-eller mer kopiorav detta (föregående) uttryck. Till exempel motsvarar "*" en tom sträng, "X", "Y", "ZX", "ZYX", etc.
  • \n.*, var n. - Detta är ett tal från 1 till 9, motsvarar noll eller flera poster för överensstämmelse. n.- En markant imitation. Till exempel motsvarar "\\ (a. \\) C \\ 1 *" "abcab" och "abcaba", men inte "abcac".

Uttrycket som avslutades i "\\ (" och "\\)" och åtföljd "*" bör anses vara felaktigt. I vissa fall motsvarar det noll eller mer förekomster av strängen som var innesluten i parentes. I andra motsvarar det uttrycket som är inneslutet i konsolen, med tanke på symbolen "*".

\{x.,y.\} Motsvarar den sista ( kommande) ett block som inträffar åtminstone x. och inte mer y. tid. Till exempel motsvarar "A \\ (3.5 \\)" "AAA", "AAAA" eller "AAAAA". Till skillnad från andra operatörer kräver detta (i traditionell syntax) en Bexlesh.
.* Beteckning av något antal tecken mellan två delar av det vanliga uttrycket.

Metasimwalls Vi hjälper till att använda olika överensstämmelse. Men hur man föreställer sig metacimum av den vanliga symbolen, det vill säga symbolen [(kvadratkonsolen) värdet på kvadratkonsolen? Helt enkelt:

  • måste förhindra ( skydda) Metacimol (. * + \\? ()) Backlash. Till exempel \\. eller \\ [

För att förenkla uppgiften för vissa teckenuppsättningar kombinerades de i den så kallade. klasser och kategorier av tecken. POSIX standardiserad deklaration av vissa klasser och kategorier av tecken, som visas i följande tabell:

Posixklass liknande beteckning
[: Övre:] symboler i övre registret
[: Lägre:] symboler i det nedre registret
[: Alpha:] symboler i det övre och undre registret
[: Alnum:] nummer, övre och nedre register symboler
[: Siffra:] tal
[: xDigit:] hexadecimala siffror
[: Punct:] [.,!?:…] tecken på interpunktion
[: Blank:] [\\ t] utrymme och flik.
[: Plats:] [\\ t \\ n \\ r \\ f \\ v] symboler av pass
[: Cntrl:] kontrollsymboler
[: Graf:] [^ \\ t \\ n \\ r \\ f \\ v] symboler för utskrift
[: Skriv ut:] [^ \\ t \\ n \\ r \\ f \\ v] skriv ut symboler och hoppa över symboler

Regex har en sådan sak som:

Regex girighet

Jag kommer att försöka beskriva så tydligt som möjligt. Antag att vi vill hitta alla HTML-taggar i någon text. Localled uppgiften, vi vill hitta värdena för fångarna mellan< и >, tillsammans med dessa klackar. Men vi vet att taggar har en annan längd och taggar själva, minst 50 stycken. Lista dem alla, avslutande i metakamivolen - uppgiften är för tidskrävande. Men vi vet att vi har ett uttryck. * (Peka asterisk), kännetecknar ett antal tecken i strängen. Med detta uttryck kommer vi att försöka hitta i texten (

Så, Hur man skapar en 10/50 RAID på LSI MegaGaid Controller (relevant och för: Intel srcu42x, Intel srcs16):

) Alla värden mellan< и >. Som ett resultat kommer hela strängen att motsvara detta uttryck. Varför, för Remex - Zhaden och försöker fånga alla antal tecken mellan< и >, respektive hela linjen börjar < p\u003e Så, ...och efterbehandling ...> kommer att tillhöra denna regel!

Jag hoppas till exempel, det är klart vad girighet är. För att bli av med detta girighet kan du gå på nästa sätt:

  • ta hänsyn till tecknen inte Relevant önskat prov (till exempel:<[^>] *\u003e För det ovan beskrivna ärendet)
  • pålitlig från girighet genom att lägga till en kvantifieringsdefinition som oönskade:
    • *? - "inte girig" ("lat") ekvivalent *
    • +? - "inte girig" ("lat") ekvivalent +
    • (n,)? - "inte girig" ("lat") ekvivalent (n,)
    • . *? - "inte girig" ("lat") ekvivalent. *

Allt ovanstående vill komplettera syntaxen för utökade vanliga uttryck:

Regelbundna uttryck i POSIX liknar den traditionella UNIX-syntaxen, men med tillägg av vissa metasimvoler:

Ett plusindikerar att tidigaresymbol eller gruppkan upprepas en eller flera gånger. Till skillnad från stjärnorna krävs minst en repetition.

Frågetecken Gör. tidigaresymbolen eller gruppen är valfri. Med andra ord, i lämplig linje det kan vara frånvarande eller närvarande slät etttid.

Vertikal egenskapdelar alternativa alternativ för regelbundna uttryck. Ett tecken ställer in två alternativ, men det kan finnas fler av dem, det är tillräckligt att använda mer vertikala skrik. Man måste komma ihåg att den här operatören använder den maximala möjliga delen av uttrycket. Av denna anledning används den alternativa operatören oftast inom parenteserna.

Det avbröts också användningen av omvänd flätan [... \\) blir (...) och \\ (... \\) blir (...).

I slutet av posten kommer jag att ge några exempel på att använda regex:

$ Katt text1 1 äpple 2 päron 3 banan $ grep p text1 1 äpple 2 päron $ grep ärt text1 2 päron $ grep "p *" text1 1 äpple 2 päron 3 banan $ grep "pp *" text1 1 äpple 2 päron $ grep " X "text1 $ grep" x * "Text1 1 äpple 2 päron 3 banan $ katt text1 | Grep "L \\ | N" 1 äpple 3 Banana $ echo -e "hitta en \\ n * här" | Grep "\\ *" * här $ grep "pp \\ +" text1 # strängar, med ett innehåll av en p och 1 eller flera p 1 äpple $ grep "pl \\? E" text1 1 äpple 2 päron $ grep "pl \\? E "text1 # PE med en möjlig symbol L 1 Apple 2 Pear $ grep" s. * R "text1 # p, i linjer där det finns r 2 päron $ grep" a .. "text1 # rader med a, följt av på minst 2 tecken 1 äpple 3 banan $ grep "\\ (an \\) \\ +" text1 # Sök efter mer upprepa en 3 banan $ grep "en \\ (an \\) \\ +" text1 # Sök efter 2x upprepar en 3 banan $ grep "" Text1 # Sök rader, där det finns 3 eller p 1 äpple 2 päron 3 banan $ echo -e "hitta en \\ n * här \\ nsomewhere." | Grep "[. *]" * Hermafoder. $ # Letar efter symboler från 3 till 7 $ echo -e "123 \\ n456 \\ n789 \\ n0" | Grep "" "123 456 789 $ # letar efter en siffra, bakom vilken det inte finns några bokstäver n och r $ grep till slutet av linjen" [[: siffror:]] [^ nr] * $ "Text1 1 Apple $ Sed -e "/ \\ (a. * A \\) \\ | \\ (s. * P \\) / s / a / a / g" text1 # ersättning och på en i alla linjer, där efter och eller efter att R går p 1 Apple 2 Pear 3 Banana $ SED -E "/ ^ [^ lmnxyz] * $ / s / öra / varje / g" Text1 # Byta öra på var och en i rader som inte börjar på LMNXYZ 1 Apple 2 Peach 3 Banana $ Echo "Först . En fras. Det här är en känsla. " | \\ # Byte av det sista ordet i en mening i sista världen. \u003e SED -E "s / [^] * \\ ./ sista word./g" först. Ett sista ord. Detta är ett sista ord.

Regelbundna uttryck är ett mycket kraftfullt verktyg för att söka efter text på mall, bearbetning och linjer, som kan användas för att lösa en rad olika uppgifter. Här är de viktigaste av dem:

  • Kontrollera textinmatning;
  • Sök och ersätt text i filen;
  • Paketbyte av filer;
  • Interaktion med tjänster som Apache;
  • Kontrollera strängen för att matcha mallen.

Det är långt ifrån full listaRegelbundna uttryck gör det möjligt för dig att göra mycket mer. Men för nya användare kan de verka för komplexa, eftersom ett speciellt språk används för att bilda dem. Men med tanke på de möjligheter som tillhandahålls, bör de reguljära uttrycken av Linux veta och kunna använda varje systemadministratör.

I den här artikeln kommer vi att överväga regelbundna bash-uttryck för nybörjare så att du kan hantera alla funktioner i det här verktyget.

I reguljära uttryck kan två typer av tecken användas:

  • vanliga bokstäver;
  • metacimol.

Konventionella tecken är bokstäver, siffror och skiljetecken från vilka några rader består. Alla texter består av bokstäver och du kan använda dem i reguljära uttryck för att söka efter önskad position i texten.

Metasimwalls är något annat, det är de som ger styrka till vanliga uttryck. Med hjälp av Metasimvol kan du göra mycket mer än att söka efter en symbol. Du kan söka efter kombinationer av tecken, använd det dynamiska numret på deras nummer och välja intervall. Alla speciella mixers kan delas upp i två typer, det här är ersättningssymboler som ersätts med konventionella tecken eller uttalanden som indikerar hur många gånger symbolen kan upprepa. Syntaxen för det vanliga uttrycket kommer att se ut:

normal_simviv special mixer_productor

special Simal_Zames special mixer_productor

  • - Med en omvänd fläta börjar de alfabetiska specialisterna, och det används om det är nödvändigt att använda en speciell bildskärm i form av ett skiljetecken.
  • ^ - indikerar början på linjen;
  • $ - indikerar slutet av linjen;
  • * - Indikerar att den föregående symbolen kan upprepas 0 eller mer;
  • + - Indikerar att den föregående symbolen ska upprepa mer än en eller flera gånger.
  • ? - Den föregående symbolen kan uppstå noll eller en gång;
  • (n) - Anger hur många gånger du behöver repetera den föregående symbolen;
  • (N, n) - Den föregående symbolen kan upprepas från N till N gånger;
  • . - Alla tecken förutom att översättningen av strängen
  • - Eventuella tecken som anges i parentes;
  • x | W. - Symbol X eller Y-symbol;
  • [^ Az] - Alla tecken, utom de som anges i parentes;
  • - Alla tecken från det angivna intervallet;
  • [^ a-z] - Alla tecken som inte är i intervallet;
  • b. - betecknar ordgränsen med ett utrymme;
  • B. - Indikerar att symbolen måste vara inuti ordet, till exempel, uppräknas UX med UXB eller Tuxedo, men sammanfaller inte med Linux;
  • d. - innebär att tecknet är en siffra;
  • D. - icke-cyfactory symbol;
  • n. - linje översättningssymbol;
  • s. - En av symbolerna på utrymmet, rymden, tabuleringen och så vidare;
  • S. - Varje karaktär förutom ett utrymme;
  • t. - BECT-symbol;
  • v. - Symbol för vertikal tabulering;
  • w. - Varje bokstavsymbol, inklusive understrykning;
  • W. - Varje bokstavsymbol utom understryka
  • uxxx - Unicdoe symbol.

Det är viktigt att notera att före de ikoniska specialiteterna måste du använda snett drag för att indikera att specialisten är nästa. Det är rätt och motsatsen, om du vill använda en specialist, som appliceras utan slash som en konventionell symbol, måste du lägga till en snedställning.

Till exempel vill du hitta en rad 1+ 2 \u003d 3 i texten. Om du använder den här raden som ett vanligt uttryck, hittar du inte något, eftersom systemet tolkar ett plus som specialist, som rapporterar att den föregående enheten måste upprepa en eller flera gånger. Därför måste den vara avskärmad: 1 + 2 \u003d 3. Utan avskärmning skulle vårt vanliga uttryck motsvara endast en sträng 11 \u003d 3 eller 111 \u003d 3 och så vidare. Innan linjen inte är nödvändig, eftersom det inte är specialist.

Exempel på att använda reguljära uttryck

Nu när vi har övervägt grunderna och du vet hur allt fungerar, är det fortfarande att konsolidera kunskapen som uppnåtts om vanliga Linux Grep-uttryck i praktiken. Två mycket användbara speciella symboler är ^ och $, vilket indikerar början och slutet av strängen. Till exempel vill vi få alla användare som är registrerade i vårt system vars namn börjar s. Då kan du tillämpa ett vanligt uttryck «^ S». Du kan använda kommandot eGREP:

egrep "^ s" / etc / passwd

Om vi \u200b\u200bvill välja strängar enligt det sista tecknet i linjen, som kan användas $ för detta. Välj till exempel alla systemanvändare, utan ett skal, registrerar om sådana användare slutar på falska:

egrep "falskt $" / etc / passwd

För att visa användarnamn som startar på S eller D, använd ett sådant uttryck:

egrep "^" / etc / passwd

Samma resultat kan erhållas med hjälp av symbolen "|". Det första alternativet är mer lämpligt för intervallet, och den andra används ofta för normal eller / eller:

egrep "^" / etc / passwd

Låt oss nu välja alla användare vars namn inte är tre tecken. Användarnamnet är klart med en kolon. Vi kan säga att det kan innehålla en bokstavsymbol som måste upprepas tre gånger, före kolon:

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

Slutsatser

I den här artikeln granskade vi vanliga Linux-uttryck, men det var bara de flesta grunderna. Om du röker lite djupare, kommer du att hitta det med det här verktyget kan du göra mycket mer intressanta saker. Den tid som spenderas på utvecklingen av regelbundna uttryck kommer definitivt att kosta det.

I slutet av föreläsningen från Yandex Pro-reguljära uttryck: