sed - regulární výrazy

Napsal Mgr.Radovan Kaluža (») 4. 1. 2007 v kategorii Operační systémy, přečteno: 3860×

Vyhledávání a nahrazování textu podle určité šablony.


Regulární výraz je určitá šablona určující textový řetězec. Používá se například ve formulářích, kde kontrolujeme správnost PSČ, regulární výraz nám říká že se musí jednat o pět číslic s možností jedné mezery.

sed symboly


[] .. vše v této závorce bere jako přípustné znaky
[1-4] .. znamená čísla 1 až 4
[D,Z] .. znamená písmena D a Z

() .. gruping, neboli co je v této závorce se bude brát jako jeden řetězec

| .. nebo
[ahoj,cau] .. znamená slovo ahoj nebo cau

^ .. označuje začátek řetězce
$ .. označuje konec řetězce

.. označuje nasledujíci metacharakter ( třeba ,[,] )
. .. označuje jakýkoliv znak kromě nové řádky

* .. označuje vyskyt 0 až nekonečně
+ .. označuje vyskyt 1 až nekonečně
? .. "" "" 1 nebo 0
{n} .. "" "" prave n-krat
{n,} .. "" "" nejméně n-krat
{n,m} .. "" "" nejméně n-krat, nejvice m-krat

\t .. tabulátor
\n .. nový řádek
w .. alfanumerická znak + "_" )
W .. opak w
s .. byloznakove znaky ( mezera tabelator .. )
S .. opak s
d .. číslo
D .. opak d

příklady regulárních výrazů


v případě ze chceme vyhledat napřiklad znak [, což je metaznak použijeme
echo "-[-]-" | sed 's/[\[]/X/g'

nahradí všechny znaky 1 až 9 pismenem X
echo "11 stare 22 stare 33 stare" | sed 's/[1-9]/X/g'
výsledek
XX stare XX stare XX stare

nahradí znaky a,2,4 pismenem X
echo "11 stare 22 stare 33 stare" | sed 's/[a,2,4]/X/g'
výsledek
11 stXre XX stXre 33 stXre

nahradí znak 1 az 9 písmenem X pokud je na začátku řetězce (^)
echo "11 stare 22 stare 33 stare" | sed 's/^[1-9]/X/g'
výsledek
X stare 22 stare 33 stare

nahradi slovo "stare", které je na konci radku , slovem X
echo "11 stare 22 stare 33 stare" | sed 's/stare$/X/g'
výsledek
11 stare 22 stare 33 X

nahradi pismenem X v řetězci cislice 1 až 4, pokud jsou dvě az čtyři za sebou
echo "11 2 3333" | sed 's/\([1-4]\{2,4\}\)/X/g'
výsledek
X 2 X



hledá řádek po řádku, vypíše slova splňující následující regulární výraz
echo "--aaBANANbb--" | sed 's#.*aa\(.*\)bb.*#\1#'
rozepíšeme si regulární výraz, podle něhož hledáme
.*aa(.*)bb.*
.* - začiná libovolnými znaky (žádným znakem nebo více)
aa - potom slovo aa
(.*) - potom libovolné znaky, v kulaté zavorce, toto je první výraz, který si pamatuj
(odvoláváme se na něj pomocí 1)
bb - nasleduje slovo bb

výsledek
BANAN



echo "---aaBANANbb---" | sed 's#.*aa\(\w\{2\}\)\(.*\)bb.*#\1 a \2#'
.*aa(w{2})(.*)bb.*
.* - začiná libovolnými znaky (žádným znakem nebo více)
aa - potom slovo aa
(w{2}) - tento výraz si zapamatuj, libovolné dva alfanumerické znaky
(odvoláváme se na něj pomocí 1)
(.*) - potom libovolné znaky, v kulaté zavorce, toto je první výraz, který si pamatuj
(odvoláváme se na něj pomocí 2)
bb - nasleduje slovo bb

výsledek
BA a NAN



echo "http://www.banan.cz?page=kontakt" | sed 's#.*\.\(.*\)\..*#\1#'
.*.(.*)..*
.* - libovolné znaky
. - následuje tečka, nyní není uveden kvantifikátor, proto tento symbol zastupuju znak tečky
(.*) - tento výraz si zapamatuj
. - následuje tečka
.* - libovolné znaky

výsledek
banan



smaže mezery zleva
sed 's/^[ \t]*//' soubor
^ - začátek řádky
[ ]* - libovolný počet tabulátorů

smaže mezery zprava
sed 's/[ \t]*$//'
$ - konec řádky


vypíše 22
echo "ex22" | sed 's/ex\([0-9]\{2\}\)/\1/g'


nahradí poslední výskyt slova "stare"
echo "ahoj jak se mas stare1 stare2 stare3 ana" | sed 's/\(.*\)stare/\1nove/'



Štítky: sed
Facebook Twitter Topčlánky.cz Linkuj.cz

Komentáře

Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
Článek ještě nebyl okomentován.


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
  [b] [obr]
Odpovězte prosím číslicemi: Součet čísel dvě a deset