<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fi">
	<id>https://www.linux.fi/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ordyh</id>
	<title>Linux.fi - Käyttäjän muokkaukset [fi]</title>
	<link rel="self" type="application/atom+xml" href="https://www.linux.fi/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ordyh"/>
	<link rel="alternate" type="text/html" href="https://www.linux.fi/wiki/Toiminnot:Muokkaukset/Ordyh"/>
	<updated>2026-04-06T13:42:20Z</updated>
	<subtitle>Käyttäjän muokkaukset</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=32516</id>
		<title>Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=32516"/>
		<updated>2010-09-20T00:32:28Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: /* Teoriaa */ korjaus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Säännöllinen lauseke&#039;&#039;&#039; (engl. &#039;&#039;&#039;regular expression&#039;&#039;&#039;, &#039;&#039;&#039;regexp&#039;&#039;&#039;) on yksinkertainen merkkijonokieli, joka voi joko &#039;&#039;vastata&#039;&#039; tai &#039;&#039;olla vastaamatta&#039;&#039; jotain toista merkkijonoa.  Linux- ja Unix-järjestelmissä säännöllisiä lauskkeista on suurta hyötyä [[komentorivi]]ä käytettäessä esimerkiksi merkkijonojen etsimis- ja korvaustoiminnoissa. Niiden voidaankin sanoa olevan [[putki]]ttamiseen yhdistettynä tärkeimpiä työkaluja, joita komentorivin edistynyt käyttö edellyttää.&lt;br /&gt;
&lt;br /&gt;
Tässä artikkelissa on esitetty johdatus säännöllisiin lausekkeisiin siten, miten komentorivityöklu &amp;lt;tt&amp;gt;[[grep]]&amp;lt;/tt&amp;gt; ne ymmärtää &#039;&#039;laajennettussa&#039;&#039; (engl. extended) tilassa. Perusoperaattorit (&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;, sulut) ovat &#039;&#039;universaaleja&#039;&#039;, eli kaikki toteutukset tukevat niitä. Kaikissa säännöllisten lausekkeiden toteutuksissa syntaksi ei kuitenkaan ole aivan sama. &lt;br /&gt;
&lt;br /&gt;
Säännöllisistä lausekkeista on yleisesti käytössä kolme tyyppiä: &#039;&#039;tavallinen&#039;&#039; (engl. basic), &#039;&#039;laajennettu &#039;&#039;(engl. extended) ja &#039;&#039;[[Perl]]-tyyppinen&#039;&#039;. Tässä ohjeessa esitetty syntaksi on yhteensopiva Linuxin [[GNU]]-grepin laajennetun syntaksin kanssa jollei toisin mainita. GNU grepin syntaksi taas on yhteensopiva [[POSIX]]-standardin mukaisten säännöllisten lausekkeiden kanssa. Varsinkin useassa järjestelmässä käytettäviä [[skripti|skriptejä]] kirjoitettaessa täytyy olla huolellinen siinä, mitkä rakenteet ovat uudempia laajennoksia. Erotuksena grep myös käsittelee syötettä rivi riviltä. Toisissa ohjelmissa saatetaan käsitellä rivinvaihtoa tavallisena merkkinä.&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita ei tule sekoittaa tiedostonimi-jokereihin (glob), joilla on samantapainen toiminnallisuus (vrt. &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;.*&amp;lt;/tt&amp;gt;). Tiedostonimijokereita ja säännöllisiä lausekkeita voi hydöyntää usein samoissa yhteyksissä, mutta säännölliset lausekkeet ovat tiedostonimijokereita ilmaisuvoimaisempia.&lt;br /&gt;
&lt;br /&gt;
== Teoriaa ==&lt;br /&gt;
[[wikipedia:fi:Tietojenkäsittelytiede|Tietojenkäsittelytieteessä]] säännöllissiä lausekkeita käsitellään [[wikipedia:fi:säännöllinen kieli|säännöllisten kielten]] teoriassa. Säännöllinen lauseke on esimerkki [[wikipedia:fi:äärellinen automaatti|äärellisestä automaatista]]. Säännöllisten lauskkeiden historia juontaa juurensa 50- ja 60-luvuille tietojenkäsittelytieteen syntyaikohiin.&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita voi hyödyntää monissa ohjelmointikielissä (mm. Perl, Java, Python, ECMAScript). Mille tahansa [[wikipedia:en:Turing complete|Turing-täydelliselle]] ohjelmointikielelle voidaan myös aina kirjoittaa säännöllisten lausekkeiden [[wikipedia:fi:Ohjelmointikielen tulkki|tulkki]].&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
Ensimmäisenä säännöllisten lausekkeiden toteutuksena aidolle tietokoneelle (IBM 7094) pidetään Unix-pioneeri [[wikipedia:fi:Ken Thompson|Ken Thompson]]in julkaisua [http://portal.acm.org/citation.cfm?doid=363347.363387 Regular Expression Search Algorithm] vuodelta 1968. [[Unix]]-järjestelmissä säännöllisiä lausekkeita on siten voinut hyödyntää aina ensimmäisistä versioista lähtien. Ensimmäinen [[grep]]-ohjelma kirjoitettiin ilmeisesti vuonna 1973.&amp;lt;sup&amp;gt;[http://www.columbia.edu/~rh120/ch001j.c11]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Johdatus säännöllisiin lausekkeisiin ==&lt;br /&gt;
&lt;br /&gt;
===Perusteet===&lt;br /&gt;
Säännöllinen lauseke joko &#039;&#039;vastaa&#039;&#039; tai &#039;&#039;ei vastaa&#039;&#039; merkkijonoa. Kutsutaan säännöllistä lauseketta &#039;&#039;lausekkeeksi&#039;&#039; ja merkkijonoa, jonka vastaavuus lausekkeeseen halutaan selvittää, &#039;&#039;kohteeksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lausekkeen yksinkertaiset kirjoitusmerkit vastaavat yksi-yhteen kohteen kirjoitusmerkkejä. Tämän vuoksi lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa yllätyksettömästi kohdetta&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei kohdetta&lt;br /&gt;
 bono&lt;br /&gt;
&lt;br /&gt;
Yleensä (mm. grep ja awk) katsotaan, että kohteen alussa ja lopussa voi olla mielivaltainen määrä ei-vastaavia merkkejä. Tällöin kohde (s.o. näiden komentojen tapauksessa jokin &#039;&#039;rivi&#039;&#039; jossain tiedostossa) vastaa lauseketta, jos edes jokin sen &#039;&#039;osa&#039;&#039; vastaa lauseketta. Siis grep ja awk -yhteydessä lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa kohdetta&lt;br /&gt;
 bo&#039;&#039;&#039;abba&#039;&#039;&#039;bo&lt;br /&gt;
ja&lt;br /&gt;
 dada&#039;&#039;&#039;abba&#039;&#039;&#039;gada&lt;br /&gt;
mutta ei silti kohdetta&lt;br /&gt;
 b&#039;&#039;&#039;abb&#039;&#039;&#039;bab&lt;br /&gt;
&lt;br /&gt;
===Operaattorit===&lt;br /&gt;
Yksi-yhteen vastaavien kirjoitusmerkkien lisäksi säännöllisissä lausekkeissa on mahdollisuus käyttää erilaisia &#039;&#039;operaattorimerkkejä&#039;&#039;, joilla on lausekkeessa erikoismerkitys.&lt;br /&gt;
&lt;br /&gt;
====Vaihtoehtoisuusoperaattori: &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Näistä ensimmäinen on operaattori &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;, joka tarkoittaa &#039;&#039;vaihtelua&#039;&#039; tai &#039;&#039;alternointia&#039;&#039; (engl. alternation). Sen merkitys on sama kuin luonnollisen kielen sanalla &amp;quot;tai&amp;quot;. Lauseke&lt;br /&gt;
 omena|luumu&lt;br /&gt;
vastaa sekä kohteita&lt;br /&gt;
 &#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
että&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;&lt;br /&gt;
Kun lisäksi muistamme yltä, että komentorivityökalujen tapauksessa kohde voi sisältää ei-vastaavia merkkejä sekä alussa että lopussa, vastaa ylläoleva lauseke &amp;lt;tt&amp;gt;omena|luumu&amp;lt;/tt&amp;gt; myös merkkijonoja&lt;br /&gt;
 uuni&#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
tai&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;soppa&lt;br /&gt;
Huomaa kuitenkin, että seuraavassa kohteessa vain ensimmäinen esiintymä vastaa lauseketta&lt;br /&gt;
 kotimainen &#039;&#039;&#039;omena&#039;&#039;&#039;-luumuhillo&lt;br /&gt;
&lt;br /&gt;
====Toisto-operaattorit====&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja ilmaisulla &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; on säännöllisissä lausekkeissa erikoismerkitys, joka vaikuttaa niitä &#039;&#039;välittömästi edeltävään&#039;&#039; merkkiin.&lt;br /&gt;
&lt;br /&gt;
=====Mielivaltaisen monta: &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, tai ei kertaakaan&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab*a&lt;br /&gt;
vastaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Todettakooon, että selvästi b-merkkien määrä kohteessa voi olla mielivaltainen, joten eri vastaavia kohdemerkkijonoja on olemassa myös ääretön määrä.&lt;br /&gt;
&lt;br /&gt;
=====Vähintään yksi: &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, mutta vähintään kerran&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab+a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Lausekkeen x+ voi kirjoittaa myös xx*, jolloin &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;-operaattoria ei tarvitse käyttää (se ei sisälly kaikkiin &amp;quot;tavallisen&amp;quot; syntaksin toteutuksiin).&lt;br /&gt;
&lt;br /&gt;
=====Ehdollinen: &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen kerran, tai ei kertaakaan&#039;&#039;&amp;quot;. Siten lauseke&lt;br /&gt;
 ab?a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bbbbbbbbbbbbbbbba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;ba&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====n:stä m:n kertaan: &amp;lt;tt&amp;gt;{n, m}&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Aina yllä olevat operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; eivät riitä, vaan jotain merkkiä tarvitsee vastata juuri tietyn määrän toistoja. Voitaisiin toki kirjoittaa&lt;br /&gt;
 aaaa?a?&lt;br /&gt;
jos halutaan vastata&lt;br /&gt;
 aaa&lt;br /&gt;
 aaaa&lt;br /&gt;
 aaaaa&lt;br /&gt;
mutta voidaan kirjoittaa lyhyemmin&lt;br /&gt;
 a{3,5}&lt;br /&gt;
Tämä tarkoittaa, että edeltävää merkkiä &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; voi esiintyä kolmesta viiteen kertaan. Käytetään yleisesti tästä ilmaisusta mallia &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; ovat mielivaltaisia kokonaislukuja, tarkoittaen &#039;&#039;&amp;quot;n:stä m:n kertaan&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Kumpi tahansa numeroista &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; voidaan jättää pois. Täten ilmaisu&lt;br /&gt;
 {n}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;tasan n kertaa&amp;quot;&#039;. Ilmaisu&lt;br /&gt;
 {n,}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;vähintään n kertaa&amp;quot;&#039;&#039;. Ilmaisu&lt;br /&gt;
 {,m}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;korkeintaan m kertaa&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sivuhuomatuksena todettakoon, että yllä olevan perusteella lyhyemmät operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; voitaisiin aina korvata ilmaisuilla &amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{1,}&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt; vastaavasti. {m,n}-muoto on kuitenkin uudempi laajennos, joka ei toimi kaikissa ohjelmassa.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Operaattori &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ei ole tuettu kaikissa säännöllisten lausekkeiden toteutuksissa. GNU grep tukee niitä laajennetussa tilassa (&amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===== Huomautuksia =====&lt;br /&gt;
Operaattoreita voi yhdistää mielivaltaisesti toisiinsa. Siten lauseke&lt;br /&gt;
 hur+a*!*&lt;br /&gt;
vastaavaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;hur&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurra&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa!&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurrraaa!!!!&#039;&#039;&#039;&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Toisaalta lauseke &#039;&#039;ei vastaa&#039;&#039; mitään seuraavista kohteista:&lt;br /&gt;
 burraa!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;aa!!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;uuurraa!!&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;urrur!!&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Tässä vaiheessa on hyvä varmistaa, että ymmärtää edellä esitetyn esimerkin kokonaisuudessaan.&lt;br /&gt;
&lt;br /&gt;
===Sulut: &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Kysymys:&#039;&#039;&#039; Jos halutaan vastata kohdetta &amp;lt;tt&amp;gt;hUrrUrrUrr&amp;lt;/tt&amp;gt; siten, että merkkijono &amp;lt;tt&amp;gt;Urr&amp;lt;/tt&amp;gt; voi esiintyä kohteessa äärettömän monta kertaa, miten tulee toimia?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vastaus:&#039;&#039;&#039; Tämä on mahdotonta tähän mennessä esitetyillä operaattoreilla. Voisimme toki kirjoittaa &amp;lt;tt&amp;gt;hU+r+r+&amp;lt;/tt&amp;gt; tai vastaavaa, mutta tämä vastaisi vain kohteita kuten &amp;lt;tt&amp;gt;hUUrrrr&amp;lt;/tt&amp;gt;. Tarvitsemme selvästi uuden operaattorin; &#039;&#039;sulut&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; voidaan määrittää lausekkeen osia, jotka samaan tapaan kuin koulumatematiikassa lasketaan &#039;&#039;ennen&#039;&#039; laskun muita osia. Koska säännöllisissä lausekkeissa ei kuitenkaan lasketa mitään, havainnollistetaan sulkujen merkitystä esittämällä ratkaisu yllä olevaan kysymykseen. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 h(Urr)+&lt;br /&gt;
vastaa kohteita&lt;br /&gt;
 &#039;&#039;&#039;hUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
jne. jne. Lauseke ei vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Arr&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Err&lt;br /&gt;
 burr&lt;br /&gt;
&lt;br /&gt;
Samoin kohde &lt;br /&gt;
 &#039;&#039;&#039;hUr&#039;&#039;&#039;&lt;br /&gt;
näyttää oikealta, mutta jää kuitenkin liian lyhyeksi, sillä sulkujen sisältö on löydyttävä kohteesta aina &#039;&#039;kokonaan&#039;&#039;. Siksi kohde &amp;lt;tt&amp;gt;hUr&amp;lt;/tt&amp;gt; &amp;lt;u&amp;gt;ei&amp;lt;/u&amp;gt; vastaa lauseketta &amp;lt;tt&amp;gt;h(Urr)+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Esimerkkejä====&lt;br /&gt;
&lt;br /&gt;
Sulkuja voi yhdistellä mielivaltaisesti kaikkiin operaattoreihin &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;. Seuraavassa on annettu sarja lausekkeita, sekä esimerkkejä kutakin vastaavista ja vastaamattomista kohteista:&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 d(ii)?pada+(pa|ba)?&lt;br /&gt;
vastaa esimerkiksi seuraavia kohteita&lt;br /&gt;
 &#039;&#039;&#039;diipadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista&lt;br /&gt;
 &#039;&#039;&#039;di&#039;&#039;&#039;padaapa&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;uu&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Viimeinen esimerkki jää lyhyeksi, sillä merkki &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; on lausekkeessa pakollinen vähintään kerran.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (hi|ha|ho)+&lt;br /&gt;
vastaa mitä tahansa kohdetta, jossa esiintyy mikä tahansa määrä merkkijonoja &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ha&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;ho&amp;lt;/tt&amp;gt; peräkkäin mielivaltaisen monta kertaa, kuitenkin vähintään kerran. Lauseke vastaa siis kaikkia seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;haha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hiha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hoho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihaho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hahohihohahi&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;e&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;u&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;uhu&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;ehe&lt;br /&gt;
&lt;br /&gt;
===Yhtä merkkiä vastaavat erikoismerkit===&lt;br /&gt;
Säännöllisissä lausekkeissa voi esiintyä myös joitain erikoismerkkejä, jotka eivät ole operaattoreita, eli ne eivät vaikuta niitä edeltäviin sulkuihin tai merkkeihin. Ne voitaisiin aina kirjoittaa lausekkeilla muotoa&lt;br /&gt;
 (merkki1|merkki2|merkki3|merkki4|...|merkkiN)&lt;br /&gt;
mutta tämä on varsin työlästä ja epäselkeää. Siksi säännöllisissä lausekkeissa on joitain erikoismerkkejä, jotka ovat oikopolkuja monimutkaisten vaihtoehtoisuuslausekkeiden kirjoittamiseen.&lt;br /&gt;
&lt;br /&gt;
====Jokerimerkki: &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Merkillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; (piste) on erikoismerkitys. Se vastaa aina &#039;&#039;mitä tahansa&#039;&#039; merkkiä. Lauseke&lt;br /&gt;
 .*&lt;br /&gt;
vastaa siis kaikkia mahdollisia kohteita - jopa tyhjää merkkijonoa, sillä operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa, että erikoisoperaattori &amp;quot;mikä tahansa merkki&amp;quot; voi esiintyä myös nolla kertaa. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (h.)+&lt;br /&gt;
vastaa siten kaikkia seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;he&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hy&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihrhy&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 rh&lt;br /&gt;
 ah&lt;br /&gt;
 oh&lt;br /&gt;
 ih&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;&lt;br /&gt;
Viimeinen esimerkki jää jälleen lyhyeksi, sillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; ei vastaa kuitenkaan &amp;quot;tyhjää&amp;quot; merkkiä.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 .upu&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
mutta myös&lt;br /&gt;
 &#039;&#039;&#039;supu&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 sepe&lt;br /&gt;
&lt;br /&gt;
====Merkkiluokat: &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan korjata ylläoleva Ankanpoika-esimerkki, voitaisiin kirjoittaa:&lt;br /&gt;
 (t|h|l|T|H|L)upu&lt;br /&gt;
joka vastaisi vain ja ainoastaan:&lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Merkkien &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; avulla voidaan määritellä kirjainluokkia siten, että seuraava merkki kohteessa vastaa vain ja ainoastaan jotain hakasulkujen välissä olevaa kirjainta. Siten äskeistä täysin vastaa lauseke on&lt;br /&gt;
 [thlTHL]upu&lt;br /&gt;
&lt;br /&gt;
Hakasulkujen välissä voidaan myös määritellä [[lokaali]]n aakkosjärjestyksen (LC_COLLATE) mukaisia välejä väliviivalla &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;. Tällöin &lt;br /&gt;
 19[4-9][0-9]|20[0-9][0-9]&lt;br /&gt;
vastaa kaikkia vuosilukuja välillä 1940-2099. Samoin &lt;br /&gt;
 Osasto [A-I]&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;Osasto A&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto B&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto C&#039;&#039;&#039;&lt;br /&gt;
 ...&lt;br /&gt;
 &#039;&#039;&#039;Osasto H&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto I&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;Osasto &#039;&#039;&#039;J&lt;br /&gt;
&lt;br /&gt;
On huomioitavaa, että myös kohteet ”Osasto b” tai ”Osasto È” saattavat vastata yllä esitettyä lausketta joissain [[lokaali|lokaaleissa]].&lt;br /&gt;
&lt;br /&gt;
Jos merkki &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; halutaan sisällyttää hakasulkuilmaisuun, se jätetään viimeiseksi. Esim.&lt;br /&gt;
 Ala[ -]aste&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;Ala aste&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Ala-aste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jos oikea hakasulku (&amp;lt;tt&amp;gt;]&amp;lt;/tt&amp;gt;) halutaan sisällyttää hakasulkuilmaukseen, se laitetaan hakasulkujen ensimmäiseksi merkiksi. Esim.&lt;br /&gt;
 []abcdef]+&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;b&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ab]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;d]f&#039;&#039;&#039;&lt;br /&gt;
jne., mutta ei&lt;br /&gt;
 [gi&lt;br /&gt;
 zo&lt;br /&gt;
&lt;br /&gt;
Hakasulkuilmaisusn merkitys voidaan kääntää asettamalla hattu &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; sen ensimmäiseksi merkiksi. Tällöin hakasulkuilmaisu vastaa mitä tahansa hakasuluissa &amp;lt;u&amp;gt;&#039;&#039;&#039;ei&#039;&#039;&#039;&amp;lt;/u&amp;gt; esiintyvää merkkiä kohteessa. Täten lauseke&lt;br /&gt;
 [^aeiouyåäö]+&lt;br /&gt;
vastaa mitä tahansa pelkistä konsonanteista, välimerkeistä ja numeroista koostuvaa kohdetta, kuten&lt;br /&gt;
 &#039;&#039;&#039;prrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;123&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hkr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;brr-hrr&#039;&#039;&#039;&lt;br /&gt;
jne. Mutta ei&lt;br /&gt;
 au&lt;br /&gt;
 aiai&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Grepin hyväksymissä säännöllisissä lausekkeissa merkin &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; voi sisällyttää hakasulkuilmaukseen laittamalla sen miksi tahansa muuksi merkiksi, kuin hakasulkujen ensimmäinen merkki. Tämä ei pidä välttämättä paikkaansa kuitenkaan kaikilla säännöllisten lausekkeiden toteutuksilla, vaan hattumerkin eteen on mahdollisesti laitettava pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=====POSIX-merkkiluokat=====&lt;br /&gt;
Joitain erikoismerkkiluokkia on määrätty ennakkoon grepissä. Esimerkiksi&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:digit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alpha:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alnum:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta tai numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:space:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa tyhjää (esim. välilyönti, tabulaattori) merkkiä&lt;br /&gt;
&lt;br /&gt;
Muita tällaisia ovat &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:lower:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:upper:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:xdigit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:blank:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:punct:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:print:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:cntrl:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:graph:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Merkkiluokat tulee laittaa lisäksi ulompien hakasulkujen &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; sisään. Esimerkiksi &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[[:upper:]]&amp;lt;/nowiki&amp;gt;+&lt;br /&gt;
joka vastaa C-lokaalilla (LC_CTYPE=C) ilmaisua&lt;br /&gt;
 [A-Z]+&lt;br /&gt;
eli mielivaltainen (vähintään yksi) määrä isoja kirjaimia A-Z.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Merkkiluokkia käytettäessä on huomioitava, että käytetty lokaali vaikuttaa ratkaisevasti siihen, mitä merkkejä luokkaan sisältyy. Siksi niitä ei voi käyttää tietoturvatarkistuksiin muuta kuin ennalta tiedetyillä lokaaleilla.&lt;br /&gt;
&lt;br /&gt;
====Pako-operaattori: &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan vastata jotain merkkiä, joka on määritelty operaattoriksi säännöllisissä lausekkeissa, sitä ei voida kirjoittaa sellaisenaan lausekkeeseen. Jos halutaan vastata tarkalleen jotain seuraavista&lt;br /&gt;
 Mitä?&lt;br /&gt;
 Missä?&lt;br /&gt;
 Milloin?&lt;br /&gt;
ei voida kirjoittaa lauseketta&lt;br /&gt;
 (Mi(tä|ssä|lloin))?&lt;br /&gt;
koska kysymysmerkki &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; lopussa vain ehdollista koko ulomman sulkuilmaisun, ja koko lauseke vastaisi siis vain joko tyhjää merkkijonoa tai kysymysmerkitöntä kysymyssanaa.&lt;br /&gt;
&lt;br /&gt;
Tarvitaan pako-operaattoria &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Merkin &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tai ylipäänsä minkä tahansa opraattorimerkin erikoismerkityksen voi poistaa asettamalla sen eteen kenoviivan. Tällöin kenoviivaa välittömästi seuraava merkki täytyy esiintyä kohteessa sellaisenaan. Oikea tapa kirjoittaa yllä oleva lauseke olisi siten&lt;br /&gt;
 (Mi(tä|ssä|lloin))\?&lt;br /&gt;
Tämä vastaa vain ja ainoastaan haluttuja merkkijonoja.&lt;br /&gt;
&lt;br /&gt;
Seuraavat operaattorit on merkittävä pako-operaattorilla, jos niitä ei haluta tulkittavan erikoismerkeiksi:&lt;br /&gt;
 ( ) | * + ? { } [ ] ^ $ \&lt;br /&gt;
&lt;br /&gt;
Siis, jos halutaan vastata kohteessa kenoviivaa, on kirjoitettava &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;. Esimerkiksi Windows-polku:&lt;br /&gt;
 &#039;&#039;&amp;lt;asema&amp;gt;&#039;&#039;:\Dokumentit\&#039;&#039;&amp;lt;nimi&amp;gt;&#039;&#039;.(doc, docx tai odt)&lt;br /&gt;
voidaan löytää esim. seuraavalla säännöllisellä lausekkeella:&lt;br /&gt;
 [A-Z]:\\Dokumentit\\[a-öA-Ö0-9 _-]+\.(doc|docx|odt)&lt;br /&gt;
&lt;br /&gt;
=== Rivin alku ja loppu: &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;===&lt;br /&gt;
On voinut herätä kysymys, kuinka voidaan vastata kohdetta (s.o. riviä) &#039;&#039;tarkalleen&#039;&#039;. Heti alussa selvisi, että esim grepin mielestä kohde (rivi) vastaa lauseketta, jos lauseke esiintyy missä tahansa kohdassa riviä. Jos halutaan, että lauseke vastaa alusta loppuun tarkalleen koko riviä, on otettava käyttöön erikoismerkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;. Nämä vastaavat kohteessa rivin tai merkkijonon alkua ja loppua kuvaavia &amp;quot;näkymättömiä&amp;quot; merkkejä vastaavasti. Siten&lt;br /&gt;
 ^abba$&lt;br /&gt;
vastaa vain riviä&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei esimerkiksi&lt;br /&gt;
 babba&lt;br /&gt;
 abbab&lt;br /&gt;
 babbab&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;abb&#039;&#039;&#039;bba&lt;br /&gt;
 ^abba&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;$&lt;br /&gt;
 ^abba$&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki ====&lt;br /&gt;
&lt;br /&gt;
Merkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; antavat viimeisen silauksen grepin tehokkaaseen hyödyntämiseen. Nyt esimerkiksi, jos tulostetaan kaikki [[prosessi]]t komennolla &amp;lt;tt&amp;gt;[[ps]] -ef&amp;lt;/tt&amp;gt;, saadaan yleensä jokseenkin tälläinen listaus (esimerkissä palvelinkone):&lt;br /&gt;
 &lt;br /&gt;
 $ ps -ef&lt;br /&gt;
 UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
 root         1     0  0 Jan21 ?        00:00:34 init [2]      &lt;br /&gt;
 root      1425     1  0 Jan31 ?        00:00:00 /usr/sbin/xinetd&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
 root      5566     1  0 Jan21 ?        00:00:05 /usr/sbin/apache2 -k start&lt;br /&gt;
 root      6091     1  0 Jan21 ?        00:00:03 /usr/sbin/cron&lt;br /&gt;
 www-data 15379  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 www-data 15386  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 root     21684 32395  0 20:37 ?        00:00:00 sshd: user [priv]&lt;br /&gt;
 user     21688 21684  0 20:37 ?        00:00:00 sshd: user@pts/1&lt;br /&gt;
 user     21689 21688  0 20:37 pts/1    00:00:00 -bash&lt;br /&gt;
 user     21705 21689  0 20:37 pts/1    00:00:00 ps -ef&lt;br /&gt;
 syslog   32279     1  0 Jan21 ?        00:00:07 /sbin/syslogd -u syslog&lt;br /&gt;
 bind     32351     1  0 Jan31 ?        00:00:00 /usr/sbin/named&lt;br /&gt;
 root     32395     1  0 Jan21 ?        00:00:22 /usr/sbin/sshd&lt;br /&gt;
 (... jne ...)&lt;br /&gt;
&lt;br /&gt;
Jos haluamme ylläolevasta listasta vain &amp;quot;qmail&amp;quot; -alkuisten [[käyttäjä|käyttäjien]] prosessit, voisimme [[putki]]ttaa syötteen grepille kirjoittamalla&lt;br /&gt;
 ps -ef | grep qmail&lt;br /&gt;
Tämä kuitenkin tulostaa myös kaikki sellaiset prosessit, joiden nimikentässä esiintyy &amp;quot;qmail&amp;quot; – joukossa myös käyttäjän [[root]] prosesseja vastoin alkuperäistä tarkoitusta:&lt;br /&gt;
 $ ps -ef | grep qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Ratkaisu qmail -alkuisten käyttäjien prosessien listaamiseen on:&lt;br /&gt;
 $ ps -ef | grep ^qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Hattumerkki &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; alussa vastaa jokaisen listausrivin alkua, jota pitää välittömästi seurata merkkijono &amp;lt;tt&amp;gt;qmail&amp;lt;/tt&amp;gt;, ja tämän jälkeen voi tulla mikä tahansa merkkejä, koska loppumerkkiä ei ole tarkoituksella annettu. Grep tulostaa vain lausketta vastaavat rivit, ja tulos on haluttu.&lt;br /&gt;
&lt;br /&gt;
===== Pako komentotulkista =====&lt;br /&gt;
Jos halutaan antaa jokin monimutkaisempi ilmaisu, on hyvä asettaa säännöllinen lauseke yksinkertaisten heittomerkkien &amp;lt;tt&amp;gt;&#039;&amp;lt;/tt&amp;gt; sisään, jotta ne regexp-operaattorit, joillla on jokin erikoismerkitys [[komentotulkki|komeotulkissa]] eivät aiheuta ongelmia.&lt;br /&gt;
 $ echo moi | egrep m(o|a)i&lt;br /&gt;
 -bash: syntax error near unexpected token `(&#039;&lt;br /&gt;
Sululla &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; on erikoismerkitys komentotulkissa, samoin merkillä &amp;lt;tt&amp;gt;[[putki||]]&amp;lt;/tt&amp;gt;. Ratkaisu:&lt;br /&gt;
 $ echo moi | egrep &#039;m(o|a)i&#039;&lt;br /&gt;
 moi&lt;br /&gt;
&lt;br /&gt;
===== Laajennetut säännölliset lausekkeet: egrep =====&lt;br /&gt;
Esimerkissä käytettiin komentoa &amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;. Se on oikopolku grepin [[valitsin|valitsimelle]] &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;, joka ottaa säännöllisten lausekkeiden laajennetun (engl. extended) tuen käyttöön. Normaalissa käytössä (pelkkä komento &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) operaattorit &amp;lt;tt&amp;gt;? + {} | (&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; eivät ole käytettävissä, paitsi asettamalla niiden eteen pako-operaattorin &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Operaattoriella &amp;lt;tt&amp;gt;* . [] ^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; on sama erikoismerkitys sekä käytettäessä normaalia (&amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) että laajennettua (&amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;) syntaksia, mutta esimerkiksi merkinnöillä &amp;lt;tt&amp;gt;\(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; siis päinvastainen.&lt;br /&gt;
&lt;br /&gt;
===== Prosessoitu tuloste: awk =====&lt;br /&gt;
Jos ylläolevassa prosessilistausesimerkissä halutaan tulostaa pelkät prosessien [[PID]]-numerot, voidaan käyttää [[awk]]-työkalua seuraavasti:&lt;br /&gt;
 $ ps -ef | awk &#039;/^qmail/ { print $2 }&#039;&lt;br /&gt;
 3986&lt;br /&gt;
 3990&lt;br /&gt;
 3994&lt;br /&gt;
 3995&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä lausekkeista ==&lt;br /&gt;
Web-kuva:&lt;br /&gt;
 [^ ]+\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)&lt;br /&gt;
Päivämäärä muotoa pp.kk.vvvv:&lt;br /&gt;
 [0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}&lt;br /&gt;
2-merkkinen [[wikipedia:fi:heksadesimaalijärjestelmä|heksadesimaali]]:&lt;br /&gt;
 [0-9A-Fa-f]{2}&lt;br /&gt;
Sähköpostiosoite:&lt;br /&gt;
 [a-zA-Z0-9_]+@[a-zA-Z0-9_\.]+\.[a-zA-Z]{2,3}&lt;br /&gt;
&lt;br /&gt;
== Laajennukset ==&lt;br /&gt;
Lukuunottamatta operaattoria &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ja POSIX-luokkia (&amp;lt;tt&amp;gt;[[:luokka:]]&amp;lt;/tt&amp;gt; jne.) yllä esitetty on pitkälti universaalisti tuettua säännöllisten lausekkeiden eri toteutuksissa. Monissa toteutuksissa on kuitenkin tehty laajennuksia tähän, mutta esim. &amp;lt;tt&amp;gt;[[grep]]&amp;lt;/tt&amp;gt; ei tue seuraavia. &lt;br /&gt;
&lt;br /&gt;
=== Pakoluokat ===&lt;br /&gt;
Jos halutaan kirjoittaa lauseke, joka jossain kohtaa vastaa mitä tahansa numeromerkkiä, voidaan kirjoittaa hakasulkuilmaus &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;. Tälläisille yleisesti käytetyille luokille on kuitenkin olemassa laajennuksissa helpompia nimiä. Kutsutaan näitä &#039;&#039;pakoluokiksi&#039;&#039;. Ne muistuttavat läheisesti [[#POSIX-merkkiluokat|POSIX-merkkiluokkia]], mutta ovat lyhyempiä.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style: solid; border-collapse: collapse&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+&#039;&#039;&#039;Pakoluokat&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Ilmaisu !! Merkitys !! Vastaava hakasulkuilmaus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; || Mikä tahansa aakkonen a-z, numero tai alaviiva &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt;. || &amp;lt;tt&amp;gt;[a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\W&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa muu kuin aakkonen a-z, numero tai alaviiva. || &amp;lt;tt&amp;gt;[^a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; || Mikä tahansa tyhjä merkki (esim. välilyönti tai tabulaattori) || esim. &amp;lt;tt&amp;gt;[ \t]&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; tabulaattorimerkki&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-tyhjä merkki || esim. &amp;lt;tt&amp;gt;[^ \t]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; || Mikä tahansa numero. || &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\D&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-numero. || &amp;lt;tt&amp;gt;[^0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 \d+&lt;br /&gt;
vastaa siis kaikkia numeroita aivan siinä missä myös&lt;br /&gt;
 [0-9]+&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Grep]] ja [[Awk]]&lt;br /&gt;
** [[Putki]]&lt;br /&gt;
* [[Ed]] ja [[Sed]]: tuki säännöllisille lausekkeille&lt;br /&gt;
* [[Vi]] ja [[vim]]: näiden graaffinen tila&lt;br /&gt;
* [[Emacs]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[[wikipedia:fi:säännöllinen lauseke|Säännöllinen lauseke]]&lt;br /&gt;
*[[wikipedia:fi:äärellinen automaatti|Äärellinen automaatti]]&lt;br /&gt;
*[[wikipedia:fi:pinoautomaatti|Pinoautomaatti]]&lt;br /&gt;
*[[wikipedia:fi:turingin kone|Turingin kone]]&lt;br /&gt;
*[http://www.ohjelmointiputka.net/opas.php?tunnus=phpsl Säännölliset lausekkeet PHP:ssä] -opas Ohjelmointiputkassa&lt;br /&gt;
*[http://swtch.com/~rsc/regexp/regexp1.html Regular Expression Matching Can Be Simple And Fast]: Keskustelua säännöllisten lausekkeiden toteutuksesta C-kielellä englanniksi.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=RTorrent&amp;diff=30807</id>
		<title>RTorrent</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=RTorrent&amp;diff=30807"/>
		<updated>2010-02-24T19:50:45Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: linkkejä&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ohjelma&lt;br /&gt;
| nimi=rTorrent&lt;br /&gt;
| kuva=[[Kuva:Rtorrent.png|200px]]&lt;br /&gt;
| kuvateksti=Rtorrent jakamassa [[Debian]]in levykuvia&lt;br /&gt;
| lisenssi=[[GPL]]&lt;br /&gt;
| käyttöliittymä=tekstipohjainen/[[ncurses]]&lt;br /&gt;
| kotisivu=[http://libtorrent.rakshasa.no/ libtorrent.rakshasa.no]}}&lt;br /&gt;
&lt;br /&gt;
RTorrent on tekstikäyttöliittymää käyttävä, [[LibTorrent]]-kirjastoon perustuva BitTorrent-asiakasohjelma. RTorrent on monipuolisista ominaisuuksistaan huolimatta melko kevyt, mutta sen käytön opettelu on ehkä hieman monia muita BitTorrent-asiakasohjelmia haastavampaa. Tekstikäyttöliittymän vuoksi rTorrent on kuitenkin hyvin sopiva ajettavaksi taustalla [[Screen]]-ohjelmaa käyttäen.&lt;br /&gt;
&lt;br /&gt;
==Käyttö==&lt;br /&gt;
&lt;br /&gt;
===Näppäinkomentoja===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Näppäin !! Komento&lt;br /&gt;
|-&lt;br /&gt;
|Enter||      Lataa torrent-tiedosto (anna joko URL tai polku)&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+o||     Vaihda torrentin tallennushakemistoa&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+s||     Aktivoi torrent-tiedoston, ts. aloitta lataamisen tai jakamisen.&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+d||     Pysäyttää torrent-tiedoston liikenteen. Toinen painallus poistaa torrent-tiedoston listalta.&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+q||     Aloittaa ohjelman alasajon. Toinen painallus pakottaa ohjelman lopettamaan heti.&lt;br /&gt;
|-&lt;br /&gt;
|asd||        Ulospäin menevän liikenteen rajoitukset, +1/+5/+50 kt/s&lt;br /&gt;
|-&lt;br /&gt;
|zxc||        Ulospäin menevän liikenteen rajoitukset, -1/-5/-50 kt/s&lt;br /&gt;
|-&lt;br /&gt;
|Shift+asd||  Latauksen rajoitukset, +1/+5/+50 kt/s&lt;br /&gt;
|-&lt;br /&gt;
|Shift+zxc||  Latauksen rajoitukset, -1/-5/-50 kt/s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Katso myös ==&lt;br /&gt;
*[[Azureus]]&lt;br /&gt;
*[[BitTornado]]&lt;br /&gt;
*[[Deluge]]&lt;br /&gt;
*[[KTorrent]]&lt;br /&gt;
*[[Transmission]]&lt;br /&gt;
&lt;br /&gt;
== Muualla ==&lt;br /&gt;
* [http://libtorrent.rakshasa.no/wiki/RTorrentUserGuide Käyttöohje] ja &amp;lt;nowiki&amp;gt;esimerkki&amp;lt;/nowiki&amp;gt;[http://libtorrent.rakshasa.no/browser/trunk/rtorrent/doc/rtorrent.rc?rev=latest konfiguraatio] englanniksi&lt;br /&gt;
&lt;br /&gt;
[[Luokka:P2P-ohjelmat]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Rtorrent&amp;diff=30806</id>
		<title>Rtorrent</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Rtorrent&amp;diff=30806"/>
		<updated>2010-02-24T19:48:22Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: siirsi sivun Rtorrent uudelle nimelle RTorrent:&amp;amp;#32;oikea kirjoitusasu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#OHJAUS [[RTorrent]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=RTorrent&amp;diff=30805</id>
		<title>RTorrent</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=RTorrent&amp;diff=30805"/>
		<updated>2010-02-24T19:48:22Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: siirsi sivun Rtorrent uudelle nimelle RTorrent:&amp;amp;#32;oikea kirjoitusasu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ohjelma&lt;br /&gt;
| nimi=rTorrent&lt;br /&gt;
| kuva=[[Kuva:Rtorrent.png|200px]]&lt;br /&gt;
| kuvateksti=Rtorrent jakamassa [[Debian]]in levykuvia&lt;br /&gt;
| lisenssi=[[GPL]]&lt;br /&gt;
| käyttöliittymä=tekstipohjainen/[[ncurses]]&lt;br /&gt;
| kotisivu=[http://libtorrent.rakshasa.no/ libtorrent.rakshasa.no]}}&lt;br /&gt;
&lt;br /&gt;
RTorrent on tekstikäyttöliittymää käyttävä, [[LibTorrent]]-kirjastoon perustuva BitTorrent-asiakasohjelma. RTorrent on monipuolisista ominaisuuksistaan huolimatta melko kevyt, mutta sen käytön opettelu on ehkä hieman monia muita BitTorrent-asiakasohjelmia haastavampaa. Tekstikäyttöliittymän vuoksi rTorrent on kuitenkin hyvin sopiva ajettavaksi taustalla [[Screen]]-ohjelmaa käyttäen.&lt;br /&gt;
&lt;br /&gt;
==Käyttö==&lt;br /&gt;
&lt;br /&gt;
===Näppäinkomentoja===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Näppäin !! Komento&lt;br /&gt;
|-&lt;br /&gt;
|Enter||      Lataa torrent-tiedosto (anna joko URL tai polku)&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+o||     Vaihda torrentin tallennushakemistoa&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+s||     Aktivoi torrent-tiedoston, ts. aloitta lataamisen tai jakamisen.&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+d||     Pysäyttää torrent-tiedoston liikenteen. Toinen painallus poistaa torrent-tiedoston listalta.&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+q||     Aloittaa ohjelman alasajon. Toinen painallus pakottaa ohjelman lopettamaan heti.&lt;br /&gt;
|-&lt;br /&gt;
|asd||        Ulospäin menevän liikenteen rajoitukset, +1/+5/+50 kt/s&lt;br /&gt;
|-&lt;br /&gt;
|zxc||        Ulospäin menevän liikenteen rajoitukset, -1/-5/-50 kt/s&lt;br /&gt;
|-&lt;br /&gt;
|Shift+asd||  Latauksen rajoitukset, +1/+5/+50 kt/s&lt;br /&gt;
|-&lt;br /&gt;
|Shift+zxc||  Latauksen rajoitukset, -1/-5/-50 kt/s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Katso myös ==&lt;br /&gt;
*[[Azureus]]&lt;br /&gt;
*[[BitTornado]]&lt;br /&gt;
*[[Deluge]]&lt;br /&gt;
*[[KTorrent]]&lt;br /&gt;
*[[Transmission]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Luokka:P2P-ohjelmat]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=RTorrent&amp;diff=30804</id>
		<title>RTorrent</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=RTorrent&amp;diff=30804"/>
		<updated>2010-02-24T19:47:48Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: fmt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ohjelma&lt;br /&gt;
| nimi=rTorrent&lt;br /&gt;
| kuva=[[Kuva:Rtorrent.png|200px]]&lt;br /&gt;
| kuvateksti=Rtorrent jakamassa [[Debian]]in levykuvia&lt;br /&gt;
| lisenssi=[[GPL]]&lt;br /&gt;
| käyttöliittymä=tekstipohjainen/[[ncurses]]&lt;br /&gt;
| kotisivu=[http://libtorrent.rakshasa.no/ libtorrent.rakshasa.no]}}&lt;br /&gt;
&lt;br /&gt;
RTorrent on tekstikäyttöliittymää käyttävä, [[LibTorrent]]-kirjastoon perustuva BitTorrent-asiakasohjelma. RTorrent on monipuolisista ominaisuuksistaan huolimatta melko kevyt, mutta sen käytön opettelu on ehkä hieman monia muita BitTorrent-asiakasohjelmia haastavampaa. Tekstikäyttöliittymän vuoksi rTorrent on kuitenkin hyvin sopiva ajettavaksi taustalla [[Screen]]-ohjelmaa käyttäen.&lt;br /&gt;
&lt;br /&gt;
==Käyttö==&lt;br /&gt;
&lt;br /&gt;
===Näppäinkomentoja===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Näppäin !! Komento&lt;br /&gt;
|-&lt;br /&gt;
|Enter||      Lataa torrent-tiedosto (anna joko URL tai polku)&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+o||     Vaihda torrentin tallennushakemistoa&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+s||     Aktivoi torrent-tiedoston, ts. aloitta lataamisen tai jakamisen.&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+d||     Pysäyttää torrent-tiedoston liikenteen. Toinen painallus poistaa torrent-tiedoston listalta.&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+q||     Aloittaa ohjelman alasajon. Toinen painallus pakottaa ohjelman lopettamaan heti.&lt;br /&gt;
|-&lt;br /&gt;
|asd||        Ulospäin menevän liikenteen rajoitukset, +1/+5/+50 kt/s&lt;br /&gt;
|-&lt;br /&gt;
|zxc||        Ulospäin menevän liikenteen rajoitukset, -1/-5/-50 kt/s&lt;br /&gt;
|-&lt;br /&gt;
|Shift+asd||  Latauksen rajoitukset, +1/+5/+50 kt/s&lt;br /&gt;
|-&lt;br /&gt;
|Shift+zxc||  Latauksen rajoitukset, -1/-5/-50 kt/s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Katso myös ==&lt;br /&gt;
*[[Azureus]]&lt;br /&gt;
*[[BitTornado]]&lt;br /&gt;
*[[Deluge]]&lt;br /&gt;
*[[KTorrent]]&lt;br /&gt;
*[[Transmission]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Luokka:P2P-ohjelmat]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=RTorrent&amp;diff=30803</id>
		<title>RTorrent</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=RTorrent&amp;diff=30803"/>
		<updated>2010-02-24T19:46:26Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: fmt ja ^o&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ohjelma&lt;br /&gt;
| nimi=rTorrent&lt;br /&gt;
| kuva=[[Kuva:Rtorrent.png|200px]]&lt;br /&gt;
| kuvateksti=Rtorrent jakamassa [[Debian]]in levykuvia&lt;br /&gt;
| lisenssi=[[GPL]]&lt;br /&gt;
| käyttöliittymä=tekstipohjainen/[[ncurses]]&lt;br /&gt;
| kotisivu=[http://libtorrent.rakshasa.no/ libtorrent.rakshasa.no]}}&lt;br /&gt;
&lt;br /&gt;
RTorrent on tekstikäyttöliittymää käyttävä, [[LibTorrent]]-kirjastoon perustuva BitTorrent-asiakasohjelma. RTorrent on monipuolisista ominaisuuksistaan huolimatta melko kevyt, mutta sen käytön opettelu on ehkä hieman monia muita BitTorrent-asiakasohjelmia haastavampaa. Tekstikäyttöliittymän vuoksi rTorrent on kuitenkin hyvin sopiva ajettavaksi taustalla [[Screen]]-ohjelmaa käyttäen.&lt;br /&gt;
&lt;br /&gt;
==Käyttö==&lt;br /&gt;
&lt;br /&gt;
===Näppäinkomentoja===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Näppäin !! Komento&lt;br /&gt;
|-&lt;br /&gt;
|Enter||      Lataa torrent-tiedosto (anna joko URL tai polku)&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+o||     Vaihda torrentin tallennushakemistoa&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+s||     Aktivoi torrent-tiedoston, ts. aloitta lataamisen tai jakamisen.&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+d||     Pysäyttää torrent-tiedoston liikenteen. Toinen painallus poistaa torrent-tiedoston listalta.&lt;br /&gt;
|-&lt;br /&gt;
|Ctrl+q||     Aloittaa ohjelman alasajon. Toinen painallus pakottaa ohjelman lopettamaan heti.&lt;br /&gt;
|-&lt;br /&gt;
|asd||        Ulospäin menevän liikenteen rajoitukset, +1/+5/+50 kt/s&lt;br /&gt;
|-&lt;br /&gt;
|zxc||        Ulospäin menevän liikenteen rajoitukset, -1/-5/-50 kt/s&lt;br /&gt;
|-&lt;br /&gt;
|Shift+asd||  Latauksen rajoitukset, +1/+5/+50 kt/s&lt;br /&gt;
|-&lt;br /&gt;
|Shift+zxc||  Latauksen rajoitukset, -1/-5/-50 kt/s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Katso myös ==&lt;br /&gt;
*[[Azureus]]&lt;br /&gt;
*[[BitTornado]]&lt;br /&gt;
*[[Deluge]]&lt;br /&gt;
*[[KTorrent]]&lt;br /&gt;
*[[Transmission]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Luokka:P2P-ohjelmat]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Keskustelu:S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30794</id>
		<title>Keskustelu:Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Keskustelu:S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30794"/>
		<updated>2010-02-20T22:12:57Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: vst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Laajennokset==&lt;br /&gt;
Tarkistin muutokseni jälkeen, mitä SUS/POSIX oikeasti sanoo. {m,n} on yllätykseksini mukana &amp;amp;ndash; tulikohan mukaan silloin vai onko muistikuvani wanhasta käyttäytymisestä väärä?&lt;br /&gt;
&lt;br /&gt;
Sen sijaan ero &amp;quot;basic&amp;quot; ja &amp;quot;extended&amp;quot; välillä on, että \{, \}, \( ja \) basicissa vastaa laajennetun syntaksin merkkejä {, }, ( ja ). Tästä taisi tulla maininta. En kuitenkaan löydä merkistä + mainintaa SUS-basicissä (GNU grep käyttää basicissä merkintää &amp;quot;\+&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Mielestäni ympäristömuuttujat LC_CTYPE ja LC_COLLATE on syytä mainita, ainakaan suomenkieliselle niiden merkitys ei ole selvä (siis silloin, kun vain jompikumpi on tietyssä lokaalissa).&lt;br /&gt;
&lt;br /&gt;
--[[Käyttäjä:LP|LP]] 18. helmikuuta 2010 kello 14.27 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Kirjoitin tämän lähinnä sen perusteella, mitä GNU grep:in manuaalisivulla lukee, koska se lienee relevanteinta Linux-käyttäjän näkökulmasta. Mielestäni basic- ja extended-ilmaisujen välisiä eroja on turha käsitellä erityisen tarkasti, sillä lähes ainoa missä basic-ilmaisuihin törmää, on käytettäessä grepiä ilman -E valitsinta. Toinen mahdollisuus olisi jakaa artikkeli osiin siten, että ensiksi esitellään normaali ja sitten laajennettu syntaksi. Palautin LC_CTYPE ja LC_COLLATE -huomautukset artikkeliin. --[[Käyttäjä:Ordyh|Ordyh]] 18. helmikuuta 2010 kello 18.26 (UTC)&lt;br /&gt;
&lt;br /&gt;
::GNU (e)grep on hyvä lähtökohta, varsinkin jos GNU extended nykyään on sama kuin POSIX extended (tavallinen käyttäjä ei tarvinne basiciä). Mielestäni on kuitenkin tärkeä huomauttaa eroista, ettei Linux ajaudu erilleen muusta Unix-maailmasta (&amp;quot;kaikillahan on Word&amp;quot; :-( ). --[[Käyttäjä:LP|LP]] 18. helmikuuta 2010 kello 22.26 (UTC)&lt;br /&gt;
&lt;br /&gt;
:::Artikkelissa on nyt huomioitu GNU grepin syntaksin yhteensopivuus POSIX-syntaksin kanssa --[[Käyttäjä:Ordyh|Ordyh]] 20. helmikuuta 2010 kello 22.12 (UTC)&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30793</id>
		<title>Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30793"/>
		<updated>2010-02-20T22:12:20Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: posix-huomautus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Säännöllinen lauseke&#039;&#039;&#039; (engl. &#039;&#039;&#039;regular expression&#039;&#039;&#039;, &#039;&#039;&#039;regexp&#039;&#039;&#039;) on yksinkertainen merkkijonokieli, joka voi joko &#039;&#039;vastata&#039;&#039; tai &#039;&#039;olla vastaamatta&#039;&#039; jotain toista merkkijonoa.  Linux- ja Unix-järjestelmissä säännöllisiä lauskkeista on suurta hyötyä [[komentorivi]]ä käytettäessä esimerkiksi merkkijonojen etsimis- ja korvaustoiminnoissa. Niiden voidaankin sanoa olevan [[putki]]ttamiseen yhdistettynä tärkeimpiä työkaluja, joita komentorivin edistynyt käyttö edellyttää.&lt;br /&gt;
&lt;br /&gt;
Tässä artikkelissa on esitetty johdatus säännöllisiin lausekkeisiin siten, miten komentorivityöklu &amp;lt;tt&amp;gt;[[grep]]&amp;lt;/tt&amp;gt; ne ymmärtää &#039;&#039;laajennettussa&#039;&#039; (engl. extended) tilassa. Perusoperaattorit (&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;, sulut) ovat &#039;&#039;universaaleja&#039;&#039;, eli kaikki toteutukset tukevat niitä. Kaikissa säännöllisten lausekkeiden toteutuksissa syntaksi ei kuitenkaan ole aivan sama. &lt;br /&gt;
&lt;br /&gt;
Säännöllisistä lausekkeista on yleisesti käytössä kolme tyyppiä: &#039;&#039;tavallinen&#039;&#039; (engl. basic), &#039;&#039;laajennettu &#039;&#039;(engl. extended) ja &#039;&#039;[[Perl]]-tyyppinen&#039;&#039;. Tässä ohjeessa esitetty syntaksi on yhteensopiva Linuxin [[GNU]]-grepin laajennetun syntaksin kanssa jollei toisin mainita. GNU grepin syntaksi taas on yhteensopiva [[POSIX]]-standardin mukaisten säännöllisten lausekkeiden kanssa. Varsinkin useassa järjestelmässä käytettäviä [[skripti|skriptejä]] kirjoitettaessa täytyy olla huolellinen siinä, mitkä rakenteet ovat uudempia laajennoksia. Erotuksena grep myös käsittelee syötettä rivi riviltä. Toisissa ohjelmissa saatetaan käsitellä rivinvaihtoa tavallisena merkkinä.&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita ei tule sekoittaa tiedostonimi-jokereihin (glob), joilla on samantapainen toiminnallisuus (vrt. &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;.*&amp;lt;/tt&amp;gt;). Tiedostonimijokereita ja säännöllisiä lausekkeita voi hydöyntää usein samoissa yhteyksissä, mutta säännölliset lausekkeet ovat tiedostonimijokereita ilmaisuvoimaisempia.&lt;br /&gt;
&lt;br /&gt;
== Teoriaa ==&lt;br /&gt;
[[wikipedia:fi:Tietojenkäsittelytiede|Tietojenkäsittelytieteessä]] säännölliset lausekkeet ymmärrettään [[wikipedia:fi:säännöllinen kieli|säännöllisestä kielenä]], joka voidaan tunnistaa [[wikipedia:fi:äärellinen automaatti|äärellisellä automaatilla]]. Säännöllisten lauskkeiden historia juontaa juurensa siten 50- ja 60-luvuille tietojenkäsittelytieteen syntyaikohiin.&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita voi hyödyntää monissa ohjelmointikielissä (mm. Perl, Java, Python, ECMAScript). Mille tahansa [[wikipedia:en:Turing complete|Turing-täydelliselle]] ohjelmointikielelle voidaan myös aina kirjoittaa säännöllisten lausekkeiden [[wikipedia:fi:Ohjelmointikielen tulkki|tulkki]].&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
Ensimmäisenä säännöllisten lausekkeiden toteutuksena aidolle tietokoneelle (IBM 7094) pidetään Unix-pioneeri [[wikipedia:fi:Ken Thompson|Ken Thompson]]in julkaisua [http://portal.acm.org/citation.cfm?doid=363347.363387 Regular Expression Search Algorithm] vuodelta 1968. [[Unix]]-järjestelmissä säännöllisiä lausekkeita on siten voinut hyödyntää aina ensimmäisistä versioista lähtien. Ensimmäinen [[grep]]-ohjelma kirjoitettiin ilmeisesti vuonna 1973.&amp;lt;sup&amp;gt;[http://www.columbia.edu/~rh120/ch001j.c11]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Johdatus säännöllisiin lausekkeisiin ==&lt;br /&gt;
&lt;br /&gt;
===Perusteet===&lt;br /&gt;
Säännöllinen lauseke joko &#039;&#039;vastaa&#039;&#039; tai &#039;&#039;ei vastaa&#039;&#039; merkkijonoa. Kutsutaan säännöllistä lauseketta &#039;&#039;lausekkeeksi&#039;&#039; ja merkkijonoa, jonka vastaavuus lausekkeeseen halutaan selvittää, &#039;&#039;kohteeksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lausekkeen yksinkertaiset kirjoitusmerkit vastaavat yksi-yhteen kohteen kirjoitusmerkkejä. Tämän vuoksi lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa yllätyksettömästi kohdetta&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei kohdetta&lt;br /&gt;
 bono&lt;br /&gt;
&lt;br /&gt;
Yleensä (mm. grep ja awk) katsotaan, että kohteen alussa ja lopussa voi olla mielivaltainen määrä ei-vastaavia merkkejä. Tällöin kohde (s.o. näiden komentojen tapauksessa jokin &#039;&#039;rivi&#039;&#039; jossain tiedostossa) vastaa lauseketta, jos edes jokin sen &#039;&#039;osa&#039;&#039; vastaa lauseketta. Siis grep ja awk -yhteydessä lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa kohdetta&lt;br /&gt;
 bo&#039;&#039;&#039;abba&#039;&#039;&#039;bo&lt;br /&gt;
ja&lt;br /&gt;
 dada&#039;&#039;&#039;abba&#039;&#039;&#039;gada&lt;br /&gt;
mutta ei silti kohdetta&lt;br /&gt;
 b&#039;&#039;&#039;abb&#039;&#039;&#039;bab&lt;br /&gt;
&lt;br /&gt;
===Operaattorit===&lt;br /&gt;
Yksi-yhteen vastaavien kirjoitusmerkkien lisäksi säännöllisissä lausekkeissa on mahdollisuus käyttää erilaisia &#039;&#039;operaattorimerkkejä&#039;&#039;, joilla on lausekkeessa erikoismerkitys.&lt;br /&gt;
&lt;br /&gt;
====Vaihtoehtoisuusoperaattori: &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Näistä ensimmäinen on operaattori &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;, joka tarkoittaa &#039;&#039;vaihtelua&#039;&#039; tai &#039;&#039;alternointia&#039;&#039; (engl. alternation). Sen merkitys on sama kuin luonnollisen kielen sanalla &amp;quot;tai&amp;quot;. Lauseke&lt;br /&gt;
 omena|luumu&lt;br /&gt;
vastaa sekä kohteita&lt;br /&gt;
 &#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
että&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;&lt;br /&gt;
Kun lisäksi muistamme yltä, että komentorivityökalujen tapauksessa kohde voi sisältää ei-vastaavia merkkejä sekä alussa että lopussa, vastaa ylläoleva lauseke &amp;lt;tt&amp;gt;omena|luumu&amp;lt;/tt&amp;gt; myös merkkijonoja&lt;br /&gt;
 uuni&#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
tai&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;soppa&lt;br /&gt;
Huomaa kuitenkin, että seuraavassa kohteessa vain ensimmäinen esiintymä vastaa lauseketta&lt;br /&gt;
 kotimainen &#039;&#039;&#039;omena&#039;&#039;&#039;-luumuhillo&lt;br /&gt;
&lt;br /&gt;
====Toisto-operaattorit====&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja ilmaisulla &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; on säännöllisissä lausekkeissa erikoismerkitys, joka vaikuttaa niitä &#039;&#039;välittömästi edeltävään&#039;&#039; merkkiin.&lt;br /&gt;
&lt;br /&gt;
=====Mielivaltaisen monta: &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, tai ei kertaakaan&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab*a&lt;br /&gt;
vastaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Todettakooon, että selvästi b-merkkien määrä kohteessa voi olla mielivaltainen, joten eri vastaavia kohdemerkkijonoja on olemassa myös ääretön määrä.&lt;br /&gt;
&lt;br /&gt;
=====Vähintään yksi: &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, mutta vähintään kerran&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab+a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Lausekkeen x+ voi kirjoittaa myös xx*, jolloin &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;-operaattoria ei tarvitse käyttää (se ei sisälly kaikkiin &amp;quot;tavallisen&amp;quot; syntaksin toteutuksiin).&lt;br /&gt;
&lt;br /&gt;
=====Ehdollinen: &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen kerran, tai ei kertaakaan&#039;&#039;&amp;quot;. Siten lauseke&lt;br /&gt;
 ab?a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bbbbbbbbbbbbbbbba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;ba&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====n:stä m:n kertaan: &amp;lt;tt&amp;gt;{n, m}&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Aina yllä olevat operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; eivät riitä, vaan jotain merkkiä tarvitsee vastata juuri tietyn määrän toistoja. Voitaisiin toki kirjoittaa&lt;br /&gt;
 aaaa?a?&lt;br /&gt;
jos halutaan vastata&lt;br /&gt;
 aaa&lt;br /&gt;
 aaaa&lt;br /&gt;
 aaaaa&lt;br /&gt;
mutta voidaan kirjoittaa lyhyemmin&lt;br /&gt;
 a{3,5}&lt;br /&gt;
Tämä tarkoittaa, että edeltävää merkkiä &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; voi esiintyä kolmesta viiteen kertaan. Käytetään yleisesti tästä ilmaisusta mallia &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; ovat mielivaltaisia kokonaislukuja, tarkoittaen &#039;&#039;&amp;quot;n:stä m:n kertaan&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Kumpi tahansa numeroista &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; voidaan jättää pois. Täten ilmaisu&lt;br /&gt;
 {n}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;tasan n kertaa&amp;quot;&#039;. Ilmaisu&lt;br /&gt;
 {n,}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;vähintään n kertaa&amp;quot;&#039;&#039;. Ilmaisu&lt;br /&gt;
 {,m}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;korkeintaan m kertaa&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sivuhuomatuksena todettakoon, että yllä olevan perusteella lyhyemmät operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; voitaisiin aina korvata ilmaisuilla &amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{1,}&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt; vastaavasti. {m,n}-muoto on kuitenkin uudempi laajennos, joka ei toimi kaikissa ohjelmassa.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Operaattori &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ei ole tuettu kaikissa säännöllisten lausekkeiden toteutuksissa. GNU grep tukee niitä laajennetussa tilassa (&amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===== Huomautuksia =====&lt;br /&gt;
Operaattoreita voi yhdistää mielivaltaisesti toisiinsa. Siten lauseke&lt;br /&gt;
 hur+a*!*&lt;br /&gt;
vastaavaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;hur&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurra&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa!&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurrraaa!!!!&#039;&#039;&#039;&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Toisaalta lauseke &#039;&#039;ei vastaa&#039;&#039; mitään seuraavista kohteista:&lt;br /&gt;
 burraa!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;aa!!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;uuurraa!!&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;urrur!!&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Tässä vaiheessa on hyvä varmistaa, että ymmärtää edellä esitetyn esimerkin kokonaisuudessaan.&lt;br /&gt;
&lt;br /&gt;
===Sulut: &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Kysymys:&#039;&#039;&#039; Jos halutaan vastata kohdetta &amp;lt;tt&amp;gt;hUrrUrrUrr&amp;lt;/tt&amp;gt; siten, että merkkijono &amp;lt;tt&amp;gt;Urr&amp;lt;/tt&amp;gt; voi esiintyä kohteessa äärettömän monta kertaa, miten tulee toimia?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vastaus:&#039;&#039;&#039; Tämä on mahdotonta tähän mennessä esitetyillä operaattoreilla. Voisimme toki kirjoittaa &amp;lt;tt&amp;gt;hU+r+r+&amp;lt;/tt&amp;gt; tai vastaavaa, mutta tämä vastaisi vain kohteita kuten &amp;lt;tt&amp;gt;hUUrrrr&amp;lt;/tt&amp;gt;. Tarvitsemme selvästi uuden operaattorin; &#039;&#039;sulut&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; voidaan määrittää lausekkeen osia, jotka samaan tapaan kuin koulumatematiikassa lasketaan &#039;&#039;ennen&#039;&#039; laskun muita osia. Koska säännöllisissä lausekkeissa ei kuitenkaan lasketa mitään, havainnollistetaan sulkujen merkitystä esittämällä ratkaisu yllä olevaan kysymykseen. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 h(Urr)+&lt;br /&gt;
vastaa kohteita&lt;br /&gt;
 &#039;&#039;&#039;hUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
jne. jne. Lauseke ei vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Arr&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Err&lt;br /&gt;
 burr&lt;br /&gt;
&lt;br /&gt;
Samoin kohde &lt;br /&gt;
 &#039;&#039;&#039;hUr&#039;&#039;&#039;&lt;br /&gt;
näyttää oikealta, mutta jää kuitenkin liian lyhyeksi, sillä sulkujen sisältö on löydyttävä kohteesta aina &#039;&#039;kokonaan&#039;&#039;. Siksi kohde &amp;lt;tt&amp;gt;hUr&amp;lt;/tt&amp;gt; &amp;lt;u&amp;gt;ei&amp;lt;/u&amp;gt; vastaa lauseketta &amp;lt;tt&amp;gt;h(Urr)+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Esimerkkejä====&lt;br /&gt;
&lt;br /&gt;
Sulkuja voi yhdistellä mielivaltaisesti kaikkiin operaattoreihin &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;. Seuraavassa on annettu sarja lausekkeita, sekä esimerkkejä kutakin vastaavista ja vastaamattomista kohteista:&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 d(ii)?pada+(pa|ba)?&lt;br /&gt;
vastaa esimerkiksi seuraavia kohteita&lt;br /&gt;
 &#039;&#039;&#039;diipadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista&lt;br /&gt;
 &#039;&#039;&#039;di&#039;&#039;&#039;padaapa&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;uu&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Viimeinen esimerkki jää lyhyeksi, sillä merkki &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; on lausekkeessa pakollinen vähintään kerran.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (hi|ha|ho)+&lt;br /&gt;
vastaa mitä tahansa kohdetta, jossa esiintyy mikä tahansa määrä merkkijonoja &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ha&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;ho&amp;lt;/tt&amp;gt; peräkkäin mielivaltaisen monta kertaa, kuitenkin vähintään kerran. Lauseke vastaa siis kaikkia seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;haha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hiha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hoho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihaho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hahohihohahi&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;e&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;u&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;uhu&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;ehe&lt;br /&gt;
&lt;br /&gt;
===Yhtä merkkiä vastaavat erikoismerkit===&lt;br /&gt;
Säännöllisissä lausekkeissa voi esiintyä myös joitain erikoismerkkejä, jotka eivät ole operaattoreita, eli ne eivät vaikuta niitä edeltäviin sulkuihin tai merkkeihin. Ne voitaisiin aina kirjoittaa lausekkeilla muotoa&lt;br /&gt;
 (merkki1|merkki2|merkki3|merkki4|...|merkkiN)&lt;br /&gt;
mutta tämä on varsin työlästä ja epäselkeää. Siksi säännöllisissä lausekkeissa on joitain erikoismerkkejä, jotka ovat oikopolkuja monimutkaisten vaihtoehtoisuuslausekkeiden kirjoittamiseen.&lt;br /&gt;
&lt;br /&gt;
====Jokerimerkki: &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Merkillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; (piste) on erikoismerkitys. Se vastaa aina &#039;&#039;mitä tahansa&#039;&#039; merkkiä. Lauseke&lt;br /&gt;
 .*&lt;br /&gt;
vastaa siis kaikkia mahdollisia kohteita - jopa tyhjää merkkijonoa, sillä operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa, että erikoisoperaattori &amp;quot;mikä tahansa merkki&amp;quot; voi esiintyä myös nolla kertaa. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (h.)+&lt;br /&gt;
vastaa siten kaikkia seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;he&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hy&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihrhy&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 rh&lt;br /&gt;
 ah&lt;br /&gt;
 oh&lt;br /&gt;
 ih&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;&lt;br /&gt;
Viimeinen esimerkki jää jälleen lyhyeksi, sillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; ei vastaa kuitenkaan &amp;quot;tyhjää&amp;quot; merkkiä.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 .upu&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
mutta myös&lt;br /&gt;
 &#039;&#039;&#039;supu&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 sepe&lt;br /&gt;
&lt;br /&gt;
====Merkkiluokat: &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan korjata ylläoleva Ankanpoika-esimerkki, voitaisiin kirjoittaa:&lt;br /&gt;
 (t|h|l|T|H|L)upu&lt;br /&gt;
joka vastaisi vain ja ainoastaan:&lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Merkkien &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; avulla voidaan määritellä kirjainluokkia siten, että seuraava merkki kohteessa vastaa vain ja ainoastaan jotain hakasulkujen välissä olevaa kirjainta. Siten äskeistä täysin vastaa lauseke on&lt;br /&gt;
 [thlTHL]upu&lt;br /&gt;
&lt;br /&gt;
Hakasulkujen välissä voidaan myös määritellä [[lokaali]]n aakkosjärjestyksen (LC_COLLATE) mukaisia välejä väliviivalla &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;. Tällöin &lt;br /&gt;
 19[4-9][0-9]|20[0-9][0-9]&lt;br /&gt;
vastaa kaikkia vuosilukuja välillä 1940-2099. Samoin &lt;br /&gt;
 Osasto [A-I]&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;Osasto A&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto B&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto C&#039;&#039;&#039;&lt;br /&gt;
 ...&lt;br /&gt;
 &#039;&#039;&#039;Osasto H&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto I&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;Osasto &#039;&#039;&#039;J&lt;br /&gt;
&lt;br /&gt;
On huomioitavaa, että myös kohteet ”Osasto b” tai ”Osasto È” saattavat vastata yllä esitettyä lausketta joissain [[lokaali|lokaaleissa]].&lt;br /&gt;
&lt;br /&gt;
Jos merkki &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; halutaan sisällyttää hakasulkuilmaisuun, se jätetään viimeiseksi. Esim.&lt;br /&gt;
 Ala[ -]aste&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;Ala aste&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Ala-aste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jos oikea hakasulku (&amp;lt;tt&amp;gt;]&amp;lt;/tt&amp;gt;) halutaan sisällyttää hakasulkuilmaukseen, se laitetaan hakasulkujen ensimmäiseksi merkiksi. Esim.&lt;br /&gt;
 []abcdef]+&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;b&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ab]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;d]f&#039;&#039;&#039;&lt;br /&gt;
jne., mutta ei&lt;br /&gt;
 [gi&lt;br /&gt;
 zo&lt;br /&gt;
&lt;br /&gt;
Hakasulkuilmaisusn merkitys voidaan kääntää asettamalla hattu &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; sen ensimmäiseksi merkiksi. Tällöin hakasulkuilmaisu vastaa mitä tahansa hakasuluissa &amp;lt;u&amp;gt;&#039;&#039;&#039;ei&#039;&#039;&#039;&amp;lt;/u&amp;gt; esiintyvää merkkiä kohteessa. Täten lauseke&lt;br /&gt;
 [^aeiouyåäö]+&lt;br /&gt;
vastaa mitä tahansa pelkistä konsonanteista, välimerkeistä ja numeroista koostuvaa kohdetta, kuten&lt;br /&gt;
 &#039;&#039;&#039;prrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;123&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hkr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;brr-hrr&#039;&#039;&#039;&lt;br /&gt;
jne. Mutta ei&lt;br /&gt;
 au&lt;br /&gt;
 aiai&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Grepin hyväksymissä säännöllisissä lausekkeissa merkin &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; voi sisällyttää hakasulkuilmaukseen laittamalla sen miksi tahansa muuksi merkiksi, kuin hakasulkujen ensimmäinen merkki. Tämä ei pidä välttämättä paikkaansa kuitenkaan kaikilla säännöllisten lausekkeiden toteutuksilla, vaan hattumerkin eteen on mahdollisesti laitettava pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=====POSIX-merkkiluokat=====&lt;br /&gt;
Joitain erikoismerkkiluokkia on määrätty ennakkoon grepissä. Esimerkiksi&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:digit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alpha:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alnum:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta tai numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:space:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa tyhjää (esim. välilyönti, tabulaattori) merkkiä&lt;br /&gt;
&lt;br /&gt;
Muita tällaisia ovat &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:lower:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:upper:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:xdigit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:blank:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:punct:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:print:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:cntrl:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:graph:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Merkkiluokat tulee laittaa lisäksi ulompien hakasulkujen &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; sisään. Esimerkiksi &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[[:upper:]]&amp;lt;/nowiki&amp;gt;+&lt;br /&gt;
joka vastaa C-lokaalilla (LC_CTYPE=C) ilmaisua&lt;br /&gt;
 [A-Z]+&lt;br /&gt;
eli mielivaltainen (vähintään yksi) määrä isoja kirjaimia A-Z.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Merkkiluokkia käytettäessä on huomioitava, että käytetty lokaali vaikuttaa ratkaisevasti siihen, mitä merkkejä luokkaan sisältyy. Siksi niitä ei voi käyttää tietoturvatarkistuksiin muuta kuin ennalta tiedetyillä lokaaleilla.&lt;br /&gt;
&lt;br /&gt;
====Pako-operaattori: &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan vastata jotain merkkiä, joka on määritelty operaattoriksi säännöllisissä lausekkeissa, sitä ei voida kirjoittaa sellaisenaan lausekkeeseen. Jos halutaan vastata tarkalleen jotain seuraavista&lt;br /&gt;
 Mitä?&lt;br /&gt;
 Missä?&lt;br /&gt;
 Milloin?&lt;br /&gt;
ei voida kirjoittaa lauseketta&lt;br /&gt;
 (Mi(tä|ssä|lloin))?&lt;br /&gt;
koska kysymysmerkki &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; lopussa vain ehdollista koko ulomman sulkuilmaisun, ja koko lauseke vastaisi siis vain joko tyhjää merkkijonoa tai kysymysmerkitöntä kysymyssanaa.&lt;br /&gt;
&lt;br /&gt;
Tarvitaan pako-operaattoria &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Merkin &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tai ylipäänsä minkä tahansa opraattorimerkin erikoismerkityksen voi poistaa asettamalla sen eteen kenoviivan. Tällöin kenoviivaa välittömästi seuraava merkki täytyy esiintyä kohteessa sellaisenaan. Oikea tapa kirjoittaa yllä oleva lauseke olisi siten&lt;br /&gt;
 (Mi(tä|ssä|lloin))\?&lt;br /&gt;
Tämä vastaa vain ja ainoastaan haluttuja merkkijonoja.&lt;br /&gt;
&lt;br /&gt;
Seuraavat operaattorit on merkittävä pako-operaattorilla, jos niitä ei haluta tulkittavan erikoismerkeiksi:&lt;br /&gt;
 ( ) | * + ? { } [ ] ^ $ \&lt;br /&gt;
&lt;br /&gt;
Siis, jos halutaan vastata kohteessa kenoviivaa, on kirjoitettava &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;. Esimerkiksi Windows-polku:&lt;br /&gt;
 &#039;&#039;&amp;lt;asema&amp;gt;&#039;&#039;:\Dokumentit\&#039;&#039;&amp;lt;nimi&amp;gt;&#039;&#039;.(doc, docx tai odt)&lt;br /&gt;
voidaan löytää esim. seuraavalla säännöllisellä lausekkeella:&lt;br /&gt;
 [A-Z]:\\Dokumentit\\[a-öA-Ö0-9 _-]+\.(doc|docx|odt)&lt;br /&gt;
&lt;br /&gt;
=== Rivin alku ja loppu: &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;===&lt;br /&gt;
On voinut herätä kysymys, kuinka voidaan vastata kohdetta (s.o. riviä) &#039;&#039;tarkalleen&#039;&#039;. Heti alussa selvisi, että esim grepin mielestä kohde (rivi) vastaa lauseketta, jos lauseke esiintyy missä tahansa kohdassa riviä. Jos halutaan, että lauseke vastaa alusta loppuun tarkalleen koko riviä, on otettava käyttöön erikoismerkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;. Nämä vastaavat kohteessa rivin tai merkkijonon alkua ja loppua kuvaavia &amp;quot;näkymättömiä&amp;quot; merkkejä vastaavasti. Siten&lt;br /&gt;
 ^abba$&lt;br /&gt;
vastaa vain riviä&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei esimerkiksi&lt;br /&gt;
 babba&lt;br /&gt;
 abbab&lt;br /&gt;
 babbab&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;abb&#039;&#039;&#039;bba&lt;br /&gt;
 ^abba&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;$&lt;br /&gt;
 ^abba$&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki ====&lt;br /&gt;
&lt;br /&gt;
Merkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; antavat viimeisen silauksen grepin tehokkaaseen hyödyntämiseen. Nyt esimerkiksi, jos tulostetaan kaikki [[prosessi]]t komennolla &amp;lt;tt&amp;gt;[[ps]] -ef&amp;lt;/tt&amp;gt;, saadaan yleensä jokseenkin tälläinen listaus (esimerkissä palvelinkone):&lt;br /&gt;
 &lt;br /&gt;
 $ ps -ef&lt;br /&gt;
 UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
 root         1     0  0 Jan21 ?        00:00:34 init [2]      &lt;br /&gt;
 root      1425     1  0 Jan31 ?        00:00:00 /usr/sbin/xinetd&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
 root      5566     1  0 Jan21 ?        00:00:05 /usr/sbin/apache2 -k start&lt;br /&gt;
 root      6091     1  0 Jan21 ?        00:00:03 /usr/sbin/cron&lt;br /&gt;
 www-data 15379  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 www-data 15386  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 root     21684 32395  0 20:37 ?        00:00:00 sshd: user [priv]&lt;br /&gt;
 user     21688 21684  0 20:37 ?        00:00:00 sshd: user@pts/1&lt;br /&gt;
 user     21689 21688  0 20:37 pts/1    00:00:00 -bash&lt;br /&gt;
 user     21705 21689  0 20:37 pts/1    00:00:00 ps -ef&lt;br /&gt;
 syslog   32279     1  0 Jan21 ?        00:00:07 /sbin/syslogd -u syslog&lt;br /&gt;
 bind     32351     1  0 Jan31 ?        00:00:00 /usr/sbin/named&lt;br /&gt;
 root     32395     1  0 Jan21 ?        00:00:22 /usr/sbin/sshd&lt;br /&gt;
 (... jne ...)&lt;br /&gt;
&lt;br /&gt;
Jos haluamme ylläolevasta listasta vain &amp;quot;qmail&amp;quot; -alkuisten [[käyttäjä|käyttäjien]] prosessit, voisimme [[putki]]ttaa syötteen grepille kirjoittamalla&lt;br /&gt;
 ps -ef | grep qmail&lt;br /&gt;
Tämä kuitenkin tulostaa myös kaikki sellaiset prosessit, joiden nimikentässä esiintyy &amp;quot;qmail&amp;quot; – joukossa myös käyttäjän [[root]] prosesseja vastoin alkuperäistä tarkoitusta:&lt;br /&gt;
 $ ps -ef | grep qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Ratkaisu qmail -alkuisten käyttäjien prosessien listaamiseen on:&lt;br /&gt;
 $ ps -ef | grep ^qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Hattumerkki &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; alussa vastaa jokaisen listausrivin alkua, jota pitää välittömästi seurata merkkijono &amp;lt;tt&amp;gt;qmail&amp;lt;/tt&amp;gt;, ja tämän jälkeen voi tulla mikä tahansa merkkejä, koska loppumerkkiä ei ole tarkoituksella annettu. Grep tulostaa vain lausketta vastaavat rivit, ja tulos on haluttu.&lt;br /&gt;
&lt;br /&gt;
===== Pako komentotulkista =====&lt;br /&gt;
Jos halutaan antaa jokin monimutkaisempi ilmaisu, on hyvä asettaa säännöllinen lauseke yksinkertaisten heittomerkkien &amp;lt;tt&amp;gt;&#039;&amp;lt;/tt&amp;gt; sisään, jotta ne regexp-operaattorit, joillla on jokin erikoismerkitys [[komentotulkki|komeotulkissa]] eivät aiheuta ongelmia.&lt;br /&gt;
 $ echo moi | egrep m(o|a)i&lt;br /&gt;
 -bash: syntax error near unexpected token `(&#039;&lt;br /&gt;
Sululla &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; on erikoismerkitys komentotulkissa, samoin merkillä &amp;lt;tt&amp;gt;[[putki||]]&amp;lt;/tt&amp;gt;. Ratkaisu:&lt;br /&gt;
 $ echo moi | egrep &#039;m(o|a)i&#039;&lt;br /&gt;
 moi&lt;br /&gt;
&lt;br /&gt;
===== Laajennetut säännölliset lausekkeet: egrep =====&lt;br /&gt;
Esimerkissä käytettiin komentoa &amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;. Se on oikopolku grepin [[valitsin|valitsimelle]] &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;, joka ottaa säännöllisten lausekkeiden laajennetun (engl. extended) tuen käyttöön. Normaalissa käytössä (pelkkä komento &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) operaattorit &amp;lt;tt&amp;gt;? + {} | (&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; eivät ole käytettävissä, paitsi asettamalla niiden eteen pako-operaattorin &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Operaattoriella &amp;lt;tt&amp;gt;* . [] ^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; on sama erikoismerkitys sekä käytettäessä normaalia (&amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) että laajennettua (&amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;) syntaksia, mutta esimerkiksi merkinnöillä &amp;lt;tt&amp;gt;\(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; siis päinvastainen.&lt;br /&gt;
&lt;br /&gt;
===== Prosessoitu tuloste: awk =====&lt;br /&gt;
Jos ylläolevassa prosessilistausesimerkissä halutaan tulostaa pelkät prosessien [[PID]]-numerot, voidaan käyttää [[awk]]-työkalua seuraavasti:&lt;br /&gt;
 $ ps -ef | awk &#039;/^qmail/ { print $2 }&#039;&lt;br /&gt;
 3986&lt;br /&gt;
 3990&lt;br /&gt;
 3994&lt;br /&gt;
 3995&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä lausekkeista ==&lt;br /&gt;
Web-kuva:&lt;br /&gt;
 [^ ]+\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)&lt;br /&gt;
Päivämäärä muotoa pp.kk.vvvv:&lt;br /&gt;
 [0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}&lt;br /&gt;
2-merkkinen [[wikipedia:fi:heksadesimaalijärjestelmä|heksadesimaali]]:&lt;br /&gt;
 [0-9A-Fa-f]{2}&lt;br /&gt;
Sähköpostiosoite:&lt;br /&gt;
 [a-zA-Z0-9_]+@[a-zA-Z0-9_\.]+\.[a-zA-Z]{2,3}&lt;br /&gt;
&lt;br /&gt;
== Laajennukset ==&lt;br /&gt;
Lukuunottamatta operaattoria &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ja POSIX-luokkia (&amp;lt;tt&amp;gt;[[:luokka:]]&amp;lt;/tt&amp;gt; jne.) yllä esitetty on pitkälti universaalisti tuettua säännöllisten lausekkeiden eri toteutuksissa. Monissa toteutuksissa on kuitenkin tehty laajennuksia tähän, mutta esim. &amp;lt;tt&amp;gt;[[grep]]&amp;lt;/tt&amp;gt; ei tue seuraavia. &lt;br /&gt;
&lt;br /&gt;
=== Pakoluokat ===&lt;br /&gt;
Jos halutaan kirjoittaa lauseke, joka jossain kohtaa vastaa mitä tahansa numeromerkkiä, voidaan kirjoittaa hakasulkuilmaus &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;. Tälläisille yleisesti käytetyille luokille on kuitenkin olemassa laajennuksissa helpompia nimiä. Kutsutaan näitä &#039;&#039;pakoluokiksi&#039;&#039;. Ne muistuttavat läheisesti [[#POSIX-merkkiluokat|POSIX-merkkiluokkia]], mutta ovat lyhyempiä.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style: solid; border-collapse: collapse&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+&#039;&#039;&#039;Pakoluokat&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Ilmaisu !! Merkitys !! Vastaava hakasulkuilmaus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; || Mikä tahansa aakkonen a-z, numero tai alaviiva &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt;. || &amp;lt;tt&amp;gt;[a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\W&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa muu kuin aakkonen a-z, numero tai alaviiva. || &amp;lt;tt&amp;gt;[^a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; || Mikä tahansa tyhjä merkki (esim. välilyönti tai tabulaattori) || esim. &amp;lt;tt&amp;gt;[ \t]&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; tabulaattorimerkki&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-tyhjä merkki || esim. &amp;lt;tt&amp;gt;[^ \t]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; || Mikä tahansa numero. || &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\D&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-numero. || &amp;lt;tt&amp;gt;[^0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 \d+&lt;br /&gt;
vastaa siis kaikkia numeroita aivan siinä missä myös&lt;br /&gt;
 [0-9]+&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Grep]] ja [[Awk]]&lt;br /&gt;
** [[Putki]]&lt;br /&gt;
* [[Ed]] ja [[Sed]]: tuki säännöllisille lausekkeille&lt;br /&gt;
* [[Vi]] ja [[vim]]: näiden graaffinen tila&lt;br /&gt;
* [[Emacs]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[[wikipedia:fi:säännöllinen lauseke|Säännöllinen lauseke]]&lt;br /&gt;
*[[wikipedia:fi:äärellinen automaatti|Äärellinen automaatti]]&lt;br /&gt;
*[[wikipedia:fi:pinoautomaatti|Pinoautomaatti]]&lt;br /&gt;
*[[wikipedia:fi:turingin kone|Turingin kone]]&lt;br /&gt;
*[http://www.ohjelmointiputka.net/opas.php?tunnus=phpsl Säännölliset lausekkeet PHP:ssä] -opas Ohjelmointiputkassa&lt;br /&gt;
*[http://swtch.com/~rsc/regexp/regexp1.html Regular Expression Matching Can Be Simple And Fast]: Keskustelua säännöllisten lausekkeiden toteutuksesta C-kielellä englanniksi.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Keskustelu:S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30787</id>
		<title>Keskustelu:Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Keskustelu:S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30787"/>
		<updated>2010-02-18T18:26:19Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: vs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Laajennokset==&lt;br /&gt;
Tarkistin muutokseni jälkeen, mitä SUS/POSIX oikeasti sanoo. {m,n} on yllätykseksini mukana &amp;amp;ndash; tulikohan mukaan silloin vai onko muistikuvani wanhasta käyttäytymisestä väärä?&lt;br /&gt;
&lt;br /&gt;
Sen sijaan ero &amp;quot;basic&amp;quot; ja &amp;quot;extended&amp;quot; välillä on, että \{, \}, \( ja \) basicissa vastaa laajennetun syntaksin merkkejä {, }, ( ja ). Tästä taisi tulla maininta. En kuitenkaan löydä merkistä + mainintaa SUS-basicissä (GNU grep käyttää basicissä merkintää &amp;quot;\+&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Mielestäni ympäristömuuttujat LC_CTYPE ja LC_COLLATE on syytä mainita, ainakaan suomenkieliselle niiden merkitys ei ole selvä (siis silloin, kun vain jompikumpi on tietyssä lokaalissa).&lt;br /&gt;
&lt;br /&gt;
--[[Käyttäjä:LP|LP]] 18. helmikuuta 2010 kello 14.27 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Kirjoitin tämän lähinnä sen perusteella, mitä GNU grep:in manuaalisivulla lukee, koska se lienee relevanteinta Linux-käyttäjän näkökulmasta. Mielestäni basic- ja extended-ilmaisujen välisiä eroja on turha käsitellä erityisen tarkasti, sillä lähes ainoa missä basic-ilmaisuihin törmää, on käytettäessä grepiä ilman -E valitsinta. Toinen mahdollisuus olisi jakaa artikkeli osiin siten, että ensiksi esitellään normaali ja sitten laajennettu syntaksi. Palautin LC_CTYPE ja LC_COLLATE -huomautukset artikkeliin. --[[Käyttäjä:Ordyh|Ordyh]] 18. helmikuuta 2010 kello 18.26 (UTC)&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30786</id>
		<title>Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30786"/>
		<updated>2010-02-18T18:22:20Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: LC_ ja operaattori * basic-syntaksissa&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Säännöllinen lauseke&#039;&#039;&#039; (engl. &#039;&#039;&#039;regular expression&#039;&#039;&#039;, &#039;&#039;&#039;regexp&#039;&#039;&#039;) on yksinkertainen merkkijonokieli, joka voi joko &#039;&#039;vastata&#039;&#039; tai &#039;&#039;olla vastaamatta&#039;&#039; jotain toista merkkijonoa.  Linux- ja Unix-järjestelmissä säännöllisiä lauskkeista on suurta hyötyä [[komentorivi]]ä käytettäessä esimerkiksi merkkijonojen etsimis- ja korvaustoiminnoissa. Niiden voidaankin sanoa olevan [[putki]]ttamiseen yhdistettynä tärkeimpiä työkaluja, joita komentorivin edistynyt käyttö edellyttää.&lt;br /&gt;
&lt;br /&gt;
Tässä artikkelissa on esitetty johdatus säännöllisiin lausekkeisiin siten, miten komentorivityöklu &amp;lt;tt&amp;gt;[[grep]]&amp;lt;/tt&amp;gt; ne ymmärtää &#039;&#039;laajennettussa&#039;&#039; (engl. extended) tilassa. Kaikissa säännöllisten lausekkeiden toteutuksissa syntaksi ei kuitenkaan ole aivan sama. Perusoperaattorit (&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;, sulut) ovat kuitenkin &#039;&#039;universaaleja&#039;&#039;, eli kaikki toteutukset tukevat niitä.&lt;br /&gt;
&lt;br /&gt;
Säännöllisistä lausekkeista on yleisesti käytössä kolme tyyppiä: &#039;&#039;tavallinen&#039;&#039; (engl. basic), &#039;&#039;laajennettu &#039;&#039;(engl. extended) ja &#039;&#039;[[Perl]]-tyyppinen&#039;&#039;. Varsinkin useassa järjestelmässä käytettäviä [[skripti|skriptejä]] kirjoitettaessa täytyy olla huolellinen, mikäli käyttää tavallisesta poikkeavia ilmaisuja. Tässä ohjeessa esitetty syntaksi on yhteensopiva Linuxin [[GNU]]-grepin laajennetun syntaksin kanssa jollei toisin mainita.&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita ei tule sekoittaa tiedostonimi-jokereihin (glob), joilla on samantapainen toiminnallisuus (vrt. &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;.*&amp;lt;/tt&amp;gt;). Tiedostonimijokereita ja säännöllisiä lausekkeita voi hydöyntää usein samoissa yhteyksissä, mutta säännölliset lausekkeet ovat tiedostonimijokereita ilmaisuvoimaisempia.&lt;br /&gt;
&lt;br /&gt;
== Teoriaa ==&lt;br /&gt;
[[wikipedia:fi:Tietojenkäsittelytiede|Tietojenkäsittelytieteessä]] säännölliset lausekkeet ymmärrettään [[wikipedia:fi:säännöllinen kieli|säännöllisestä kielenä]], joka voidaan tunnistaa [[wikipedia:fi:äärellinen automaatti|äärellisellä automaatilla]]. Säännöllisten lauskkeiden historia juontaa juurensa siten 50- ja 60-luvuille tietojenkäsittelytieteen syntyaikohiin.&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita voi hyödyntää monissa ohjelmointikielissä (mm. Perl, Java, Python, ECMAScript). Mille tahansa [[wikipedia:en:Turing complete|Turing-täydelliselle]] ohjelmointikielelle voidaan myös aina kirjoittaa säännöllisten lausekkeiden [[wikipedia:fi:Ohjelmointikielen tulkki|tulkki]].&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
Ensimmäisenä säännöllisten lausekkeiden toteutuksena aidolle tietokoneelle (IBM 7094) pidetään Unix-pioneeri [[wikipedia:fi:Ken Thompson|Ken Thompson]]in julkaisua [http://portal.acm.org/citation.cfm?doid=363347.363387 Regular Expression Search Algorithm] vuodelta 1968. [[Unix]]-järjestelmissä säännöllisiä lausekkeita on siten voinut hyödyntää aina ensimmäisistä versioista lähtien. Ensimmäinen [[grep]]-ohjelma kirjoitettiin ilmeisesti vuonna 1973.&amp;lt;sup&amp;gt;[http://www.columbia.edu/~rh120/ch001j.c11]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Johdatus säännöllisiin lausekkeisiin ==&lt;br /&gt;
&lt;br /&gt;
===Perusteet===&lt;br /&gt;
Säännöllinen lauseke joko &#039;&#039;vastaa&#039;&#039; tai &#039;&#039;ei vastaa&#039;&#039; merkkijonoa. Kutsutaan säännöllistä lauseketta &#039;&#039;lausekkeeksi&#039;&#039; ja merkkijonoa, jonka vastaavuus lausekkeeseen halutaan selvittää, &#039;&#039;kohteeksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lausekkeen yksinkertaiset kirjoitusmerkit vastaavat yksi-yhteen kohteen kirjoitusmerkkejä. Tämän vuoksi lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa yllätyksettömästi kohdetta&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei kohdetta&lt;br /&gt;
 bono&lt;br /&gt;
&lt;br /&gt;
Yleensä (mm. grep ja awk) katsotaan, että kohteen alussa ja lopussa voi olla mielivaltainen määrä ei-vastaavia merkkejä. Tällöin kohde (s.o. näiden komentojen tapauksessa jokin &#039;&#039;rivi&#039;&#039; jossain tiedostossa) vastaa lauseketta, jos edes jokin sen &#039;&#039;osa&#039;&#039; vastaa lauseketta. Siis grep ja awk -yhteydessä lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa kohdetta&lt;br /&gt;
 bo&#039;&#039;&#039;abba&#039;&#039;&#039;bo&lt;br /&gt;
ja&lt;br /&gt;
 dada&#039;&#039;&#039;abba&#039;&#039;&#039;gada&lt;br /&gt;
mutta ei silti kohdetta&lt;br /&gt;
 b&#039;&#039;&#039;abb&#039;&#039;&#039;bab&lt;br /&gt;
&lt;br /&gt;
===Operaattorit===&lt;br /&gt;
Yksi-yhteen vastaavien kirjoitusmerkkien lisäksi säännöllisissä lausekkeissa on mahdollisuus käyttää erilaisia &#039;&#039;operaattorimerkkejä&#039;&#039;, joilla on lausekkeessa erikoismerkitys.&lt;br /&gt;
&lt;br /&gt;
====Vaihtoehtoisuusoperaattori: &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Näistä ensimmäinen on operaattori &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;, joka tarkoittaa &#039;&#039;vaihtelua&#039;&#039; tai &#039;&#039;alternointia&#039;&#039; (engl. alternation). Sen merkitys on sama kuin luonnollisen kielen sanalla &amp;quot;tai&amp;quot;. Lauseke&lt;br /&gt;
 omena|luumu&lt;br /&gt;
vastaa sekä kohteita&lt;br /&gt;
 &#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
että&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;&lt;br /&gt;
Kun lisäksi muistamme yltä, että komentorivityökalujen tapauksessa kohde voi sisältää ei-vastaavia merkkejä sekä alussa että lopussa, vastaa ylläoleva lauseke &amp;lt;tt&amp;gt;omena|luumu&amp;lt;/tt&amp;gt; myös merkkijonoja&lt;br /&gt;
 uuni&#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
tai&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;soppa&lt;br /&gt;
Huomaa kuitenkin, että seuraavassa kohteessa vain ensimmäinen esiintymä vastaa lauseketta&lt;br /&gt;
 kotimainen &#039;&#039;&#039;omena&#039;&#039;&#039;-luumuhillo&lt;br /&gt;
&lt;br /&gt;
====Toisto-operaattorit====&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja ilmaisulla &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; on säännöllisissä lausekkeissa erikoismerkitys, joka vaikuttaa niitä &#039;&#039;välittömästi edeltävään&#039;&#039; merkkiin.&lt;br /&gt;
&lt;br /&gt;
=====Mielivaltaisen monta: &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, tai ei kertaakaan&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab*a&lt;br /&gt;
vastaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Todettakooon, että selvästi b-merkkien määrä kohteessa voi olla mielivaltainen, joten eri vastaavia kohdemerkkijonoja on olemassa myös ääretön määrä.&lt;br /&gt;
&lt;br /&gt;
=====Vähintään yksi: &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, mutta vähintään kerran&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab+a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====Ehdollinen: &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen kerran, tai ei kertaakaan&#039;&#039;&amp;quot;. Siten lauseke&lt;br /&gt;
 ab?a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bbbbbbbbbbbbbbbba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;ba&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====n:stä m:n kertaan: &amp;lt;tt&amp;gt;{n, m}&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Aina yllä olevat operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; eivät riitä, vaan jotain merkkiä tarvitsee vastata juuri tietyn määrän toistoja. Voitaisiin toki kirjoittaa&lt;br /&gt;
 aaaa?a?&lt;br /&gt;
jos halutaan vastata&lt;br /&gt;
 aaa&lt;br /&gt;
 aaaa&lt;br /&gt;
 aaaaa&lt;br /&gt;
mutta voidaan kirjoittaa lyhyemmin&lt;br /&gt;
 a{3,5}&lt;br /&gt;
Tämä tarkoittaa, että edeltävää merkkiä &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; voi esiintyä kolmesta viiteen kertaan. Käytetään yleisesti tästä ilmaisusta mallia &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; ovat mielivaltaisia kokonaislukuja, tarkoittaen &#039;&#039;&amp;quot;n:stä m:n kertaan&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Kumpi tahansa numeroista &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; voidaan jättää pois. Täten ilmaisu&lt;br /&gt;
 {n}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;tasan n kertaa&amp;quot;&#039;. Ilmaisu&lt;br /&gt;
 {n,}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;vähintään n kertaa&amp;quot;&#039;&#039;. Ilmaisu&lt;br /&gt;
 {,m}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;korkeintaan m kertaa&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sivuhuomatuksena todettakoon, että yllä olevan perusteella lyhyemmät operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; voitaisiin aina korvata ilmaisuilla &amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{1,}&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt; vastaavasti. {m,n}-muoto on kuitenkin uudempi laajennos, joka ei toimi kaikissa ohjelmassa.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Operaattori &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ei ole tuettu kaikissa säännöllisten lausekkeiden toteutuksissa. GNU grep tukee niitä laajennetussa tilassa (&amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===== Huomautuksia =====&lt;br /&gt;
Operaattoreita voi yhdistää mielivaltaisesti toisiinsa. Siten lauseke&lt;br /&gt;
 hur+a*!*&lt;br /&gt;
vastaavaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;hur&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurra&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa!&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurrraaa!!!!&#039;&#039;&#039;&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Toisaalta lauseke &#039;&#039;ei vastaa&#039;&#039; mitään seuraavista kohteista:&lt;br /&gt;
 burraa!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;aa!!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;uuurraa!!&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;urrur!!&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Tässä vaiheessa on hyvä varmistaa, että ymmärtää edellä esitetyn esimerkin kokonaisuudessaan.&lt;br /&gt;
&lt;br /&gt;
===Sulut: &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Kysymys:&#039;&#039;&#039; Jos halutaan vastata kohdetta &amp;lt;tt&amp;gt;hUrrUrrUrr&amp;lt;/tt&amp;gt; siten, että merkkijono &amp;lt;tt&amp;gt;Urr&amp;lt;/tt&amp;gt; voi esiintyä kohteessa äärettömän monta kertaa, miten tulee toimia?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vastaus:&#039;&#039;&#039; Tämä on mahdotonta tähän mennessä esitetyillä operaattoreilla. Voisimme toki kirjoittaa &amp;lt;tt&amp;gt;hU+r+r+&amp;lt;/tt&amp;gt; tai vastaavaa, mutta tämä vastaisi vain kohteita kuten &amp;lt;tt&amp;gt;hUUrrrr&amp;lt;/tt&amp;gt;. Tarvitsemme selvästi uuden operaattorin; &#039;&#039;sulut&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; voidaan määrittää lausekkeen osia, jotka samaan tapaan kuin koulumatematiikassa lasketaan &#039;&#039;ennen&#039;&#039; laskun muita osia. Koska säännöllisissä lausekkeissa ei kuitenkaan lasketa mitään, havainnollistetaan sulkujen merkitystä esittämällä ratkaisu yllä olevaan kysymykseen. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 h(Urr)+&lt;br /&gt;
vastaa kohteita&lt;br /&gt;
 &#039;&#039;&#039;hUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
jne. jne. Lauseke ei vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Arr&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Err&lt;br /&gt;
 burr&lt;br /&gt;
&lt;br /&gt;
Samoin kohde &lt;br /&gt;
 &#039;&#039;&#039;hUr&#039;&#039;&#039;&lt;br /&gt;
näyttää oikealta, mutta jää kuitenkin liian lyhyeksi, sillä sulkujen sisältö on löydyttävä kohteesta aina &#039;&#039;kokonaan&#039;&#039;. Siksi kohde &amp;lt;tt&amp;gt;hUr&amp;lt;/tt&amp;gt; &amp;lt;u&amp;gt;ei&amp;lt;/u&amp;gt; vastaa lauseketta &amp;lt;tt&amp;gt;h(Urr)+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Esimerkkejä====&lt;br /&gt;
&lt;br /&gt;
Sulkuja voi yhdistellä mielivaltaisesti kaikkiin operaattoreihin &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;. Seuraavassa on annettu sarja lausekkeita, sekä esimerkkejä kutakin vastaavista ja vastaamattomista kohteista:&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 d(ii)?pada+(pa|ba)?&lt;br /&gt;
vastaa esimerkiksi seuraavia kohteita&lt;br /&gt;
 &#039;&#039;&#039;diipadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista&lt;br /&gt;
 &#039;&#039;&#039;di&#039;&#039;&#039;padaapa&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;uu&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Viimeinen esimerkki jää lyhyeksi, sillä merkki &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; on lausekkeessa pakollinen vähintään kerran.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (hi|ha|ho)+&lt;br /&gt;
vastaa mitä tahansa kohdetta, jossa esiintyy mikä tahansa määrä merkkijonoja &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ha&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;ho&amp;lt;/tt&amp;gt; peräkkäin mielivaltaisen monta kertaa, kuitenkin vähintään kerran. Lauseke vastaa siis kaikkia seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;haha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hiha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hoho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihaho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hahohihohahi&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;e&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;u&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;uhu&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;ehe&lt;br /&gt;
&lt;br /&gt;
===Yhtä merkkiä vastaavat erikoismerkit===&lt;br /&gt;
Säännöllisissä lausekkeissa voi esiintyä myös joitain erikoismerkkejä, jotka eivät ole operaattoreita, eli ne eivät vaikuta niitä edeltäviin sulkuihin tai merkkeihin. Ne voitaisiin aina kirjoittaa lausekkeilla muotoa&lt;br /&gt;
 (merkki1|merkki2|merkki3|merkki4|...|merkkiN)&lt;br /&gt;
mutta tämä on varsin työlästä ja epäselkeää. Siksi säännöllisissä lausekkeissa on joitain erikoismerkkejä, jotka ovat oikopolkuja monimutkaisten vaihtoehtoisuuslausekkeiden kirjoittamiseen.&lt;br /&gt;
&lt;br /&gt;
====Jokerimerkki: &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Merkillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; (piste) on erikoismerkitys. Se vastaa aina &#039;&#039;mitä tahansa&#039;&#039; merkkiä. Lauseke&lt;br /&gt;
 .*&lt;br /&gt;
vastaa siis kaikkia mahdollisia kohteita - jopa tyhjää merkkijonoa, sillä operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa, että erikoisoperaattori &amp;quot;mikä tahansa merkki&amp;quot; voi esiintyä myös nolla kertaa. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (h.)+&lt;br /&gt;
vastaa siten kaikkia seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;he&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hy&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihrhy&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 rh&lt;br /&gt;
 ah&lt;br /&gt;
 oh&lt;br /&gt;
 ih&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;&lt;br /&gt;
Viimeinen esimerkki jää jälleen lyhyeksi, sillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; ei vastaa kuitenkaan &amp;quot;tyhjää&amp;quot; merkkiä.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 .upu&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
mutta myös&lt;br /&gt;
 &#039;&#039;&#039;supu&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 sepe&lt;br /&gt;
&lt;br /&gt;
====Merkkiluokat: &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan korjata ylläoleva Ankanpoika-esimerkki, voitaisiin kirjoittaa:&lt;br /&gt;
 (t|h|l|T|H|L)upu&lt;br /&gt;
joka vastaisi vain ja ainoastaan:&lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Merkkien &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; avulla voidaan määritellä kirjainluokkia siten, että seuraava merkki kohteessa vastaa vain ja ainoastaan jotain hakasulkujen välissä olevaa kirjainta. Siten äskeistä täysin vastaa lauseke on&lt;br /&gt;
 [thlTHL]upu&lt;br /&gt;
&lt;br /&gt;
Hakasulkujen välissä voidaan myös määritellä [[lokaali]]n aakkosjärjestyksen (LC_COLLATE) mukaisia välejä väliviivalla &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;. Tällöin &lt;br /&gt;
 19[4-9][0-9]|20[0-9][0-9]&lt;br /&gt;
vastaa kaikkia vuosilukuja välillä 1940-2099. Samoin &lt;br /&gt;
 Osasto [A-I]&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;Osasto A&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto B&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto C&#039;&#039;&#039;&lt;br /&gt;
 ...&lt;br /&gt;
 &#039;&#039;&#039;Osasto H&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto I&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;Osasto &#039;&#039;&#039;J&lt;br /&gt;
&lt;br /&gt;
On huomioitavaa, että myös kohteet ”Osasto b” tai ”Osasto È” saattavat vastata yllä esitettyä lausketta joissain [[lokaali|lokaaleissa]].&lt;br /&gt;
&lt;br /&gt;
Jos merkki &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; halutaan sisällyttää hakasulkuilmaisuun, se jätetään viimeiseksi. Esim.&lt;br /&gt;
 Ala[ -]aste&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;Ala aste&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Ala-aste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jos oikea hakasulku (&amp;lt;tt&amp;gt;]&amp;lt;/tt&amp;gt;) halutaan sisällyttää hakasulkuilmaukseen, se laitetaan hakasulkujen ensimmäiseksi merkiksi. Esim.&lt;br /&gt;
 []abcdef]+&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;b&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ab]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;d]f&#039;&#039;&#039;&lt;br /&gt;
jne., mutta ei&lt;br /&gt;
 [gi&lt;br /&gt;
 zo&lt;br /&gt;
&lt;br /&gt;
Hakasulkuilmaisusn merkitys voidaan kääntää asettamalla hattu &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; sen ensimmäiseksi merkiksi. Tällöin hakasulkuilmaisu vastaa mitä tahansa hakasuluissa &amp;lt;u&amp;gt;&#039;&#039;&#039;ei&#039;&#039;&#039;&amp;lt;/u&amp;gt; esiintyvää merkkiä kohteessa. Täten lauseke&lt;br /&gt;
 [^aeiouyåäö]+&lt;br /&gt;
vastaa mitä tahansa pelkistä konsonanteista, välimerkeistä ja numeroista koostuvaa kohdetta, kuten&lt;br /&gt;
 &#039;&#039;&#039;prrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;123&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hkr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;brr-hrr&#039;&#039;&#039;&lt;br /&gt;
jne. Mutta ei&lt;br /&gt;
 au&lt;br /&gt;
 aiai&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Grepin hyväksymissä säännöllisissä lausekkeissa merkin &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; voi sisällyttää hakasulkuilmaukseen laittamalla sen miksi tahansa muuksi merkiksi, kuin hakasulkujen ensimmäinen merkki. Tämä ei pidä välttämättä paikkaansa kuitenkaan kaikilla säännöllisten lausekkeiden toteutuksilla, vaan hattumerkin eteen on mahdollisesti laitettava pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=====POSIX-merkkiluokat=====&lt;br /&gt;
Joitain erikoismerkkiluokkia on määrätty ennakkoon grepissä. Esimerkiksi&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:digit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alpha:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alnum:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta tai numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:space:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa tyhjää (esim. välilyönti, tabulaattori) merkkiä&lt;br /&gt;
&lt;br /&gt;
Muita tällaisia ovat &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:lower:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:upper:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:xdigit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:blank:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:punct:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:print:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:cntrl:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:graph:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Merkkiluokat tulee laittaa lisäksi ulompien hakasulkujen &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; sisään. Esimerkiksi &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[[:upper:]]&amp;lt;/nowiki&amp;gt;+&lt;br /&gt;
joka vastaa C-lokaalilla (LC_CTYPE=C) ilmaisua&lt;br /&gt;
 [A-Z]+&lt;br /&gt;
eli mielivaltainen (vähintään yksi) määrä isoja kirjaimia A-Z.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Merkkiluokkia käytettäessä on huomioitava, että käytetty lokaali vaikuttaa ratkaisevasti siihen, mitä merkkejä luokkaan sisältyy. Siksi niitä ei voi käyttää tietoturvatarkistuksiin muuta kuin ennalta tiedetyillä lokaaleilla.&lt;br /&gt;
&lt;br /&gt;
====Pako-operaattori: &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan vastata jotain merkkiä, joka on määritelty operaattoriksi säännöllisissä lausekkeissa, sitä ei voida kirjoittaa sellaisenaan lausekkeeseen. Jos halutaan vastata tarkalleen jotain seuraavista&lt;br /&gt;
 Mitä?&lt;br /&gt;
 Missä?&lt;br /&gt;
 Milloin?&lt;br /&gt;
ei voida kirjoittaa lauseketta&lt;br /&gt;
 (Mi(tä|ssä|lloin))?&lt;br /&gt;
koska kysymysmerkki &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; lopussa vain ehdollista koko ulomman sulkuilmaisun, ja koko lauseke vastaisi siis vain joko tyhjää merkkijonoa tai kysymysmerkitöntä kysymyssanaa.&lt;br /&gt;
&lt;br /&gt;
Tarvitaan pako-operaattoria &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Merkin &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tai ylipäänsä minkä tahansa opraattorimerkin erikoismerkityksen voi poistaa asettamalla sen eteen kenoviivan. Tällöin kenoviivaa välittömästi seuraava merkki täytyy esiintyä kohteessa sellaisenaan. Oikea tapa kirjoittaa yllä oleva lauseke olisi siten&lt;br /&gt;
 (Mi(tä|ssä|lloin))\?&lt;br /&gt;
Tämä vastaa vain ja ainoastaan haluttuja merkkijonoja.&lt;br /&gt;
&lt;br /&gt;
Seuraavat operaattorit on merkittävä pako-operaattorilla, jos niitä ei haluta tulkittavan erikoismerkeiksi:&lt;br /&gt;
 ( ) | * + ? { } [ ] ^ $ \&lt;br /&gt;
&lt;br /&gt;
Siis, jos halutaan vastata kohteessa kenoviivaa, on kirjoitettava &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;. Esimerkiksi Windows-polku:&lt;br /&gt;
 &#039;&#039;&amp;lt;asema&amp;gt;&#039;&#039;:\Dokumentit\&#039;&#039;&amp;lt;nimi&amp;gt;&#039;&#039;.(doc, docx tai odt)&lt;br /&gt;
voidaan löytää esim. seuraavalla säännöllisellä lausekkeella:&lt;br /&gt;
 [A-Z]:\\Dokumentit\\[a-öA-Ö0-9 _-]+\.(doc|docx|odt)&lt;br /&gt;
&lt;br /&gt;
=== Rivin alku ja loppu: &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;===&lt;br /&gt;
On voinut herätä kysymys, kuinka voidaan vastata kohdetta (s.o. riviä) &#039;&#039;tarkalleen&#039;&#039;. Heti alussa selvisi, että esim grepin mielestä kohde (rivi) vastaa lauseketta, jos lauseke esiintyy missä tahansa kohdassa riviä. Jos halutaan, että lauseke vastaa alusta loppuun tarkalleen koko riviä, on otettava käyttöön erikoismerkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;. Nämä vastaavat kohteessa rivin tai merkkijonon alkua ja loppua kuvaavia &amp;quot;näkymättömiä&amp;quot; merkkejä vastaavasti. Siten&lt;br /&gt;
 ^abba$&lt;br /&gt;
vastaa vain riviä&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei esimerkiksi&lt;br /&gt;
 babba&lt;br /&gt;
 abbab&lt;br /&gt;
 babbab&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;abb&#039;&#039;&#039;bba&lt;br /&gt;
 ^abba&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;$&lt;br /&gt;
 ^abba$&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki ====&lt;br /&gt;
&lt;br /&gt;
Merkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; antavat viimeisen silauksen grepin tehokkaaseen hyödyntämiseen. Nyt esimerkiksi, jos tulostetaan kaikki [[prosessi]]t komennolla &amp;lt;tt&amp;gt;[[ps]] -ef&amp;lt;/tt&amp;gt;, saadaan yleensä jokseenkin tälläinen listaus (esimerkissä palvelinkone):&lt;br /&gt;
 &lt;br /&gt;
 $ ps -ef&lt;br /&gt;
 UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
 root         1     0  0 Jan21 ?        00:00:34 init [2]      &lt;br /&gt;
 root      1425     1  0 Jan31 ?        00:00:00 /usr/sbin/xinetd&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
 root      5566     1  0 Jan21 ?        00:00:05 /usr/sbin/apache2 -k start&lt;br /&gt;
 root      6091     1  0 Jan21 ?        00:00:03 /usr/sbin/cron&lt;br /&gt;
 www-data 15379  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 www-data 15386  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 root     21684 32395  0 20:37 ?        00:00:00 sshd: user [priv]&lt;br /&gt;
 user     21688 21684  0 20:37 ?        00:00:00 sshd: user@pts/1&lt;br /&gt;
 user     21689 21688  0 20:37 pts/1    00:00:00 -bash&lt;br /&gt;
 user     21705 21689  0 20:37 pts/1    00:00:00 ps -ef&lt;br /&gt;
 syslog   32279     1  0 Jan21 ?        00:00:07 /sbin/syslogd -u syslog&lt;br /&gt;
 bind     32351     1  0 Jan31 ?        00:00:00 /usr/sbin/named&lt;br /&gt;
 root     32395     1  0 Jan21 ?        00:00:22 /usr/sbin/sshd&lt;br /&gt;
 (... jne ...)&lt;br /&gt;
&lt;br /&gt;
Jos haluamme ylläolevasta listasta vain &amp;quot;qmail&amp;quot; -alkuisten [[käyttäjä|käyttäjien]] prosessit, voisimme [[putki]]ttaa syötteen grepille kirjoittamalla&lt;br /&gt;
 ps -ef | grep qmail&lt;br /&gt;
Tämä kuitenkin tulostaa myös kaikki sellaiset prosessit, joiden nimikentässä esiintyy &amp;quot;qmail&amp;quot; – joukossa myös käyttäjän [[root]] prosesseja vastoin alkuperäistä tarkoitusta:&lt;br /&gt;
 $ ps -ef | grep qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Ratkaisu qmail -alkuisten käyttäjien prosessien listaamiseen on:&lt;br /&gt;
 $ ps -ef | grep ^qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Hattumerkki &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; alussa vastaa jokaisen listausrivin alkua, jota pitää välittömästi seurata merkkijono &amp;lt;tt&amp;gt;qmail&amp;lt;/tt&amp;gt;, ja tämän jälkeen voi tulla mikä tahansa merkkejä, koska loppumerkkiä ei ole tarkoituksella annettu. Grep tulostaa vain lausketta vastaavat rivit, ja tulos on haluttu.&lt;br /&gt;
&lt;br /&gt;
===== Pako komentotulkista =====&lt;br /&gt;
Jos halutaan antaa jokin monimutkaisempi ilmaisu, on hyvä asettaa säännöllinen lauseke yksinkertaisten heittomerkkien &amp;lt;tt&amp;gt;&#039;&amp;lt;/tt&amp;gt; sisään, jotta ne regexp-operaattorit, joillla on jokin erikoismerkitys [[komentotulkki|komeotulkissa]] eivät aiheuta ongelmia.&lt;br /&gt;
 $ echo moi | egrep m(o|a)i&lt;br /&gt;
 -bash: syntax error near unexpected token `(&#039;&lt;br /&gt;
Sululla &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; on erikoismerkitys komentotulkissa, samoin merkillä &amp;lt;tt&amp;gt;[[putki||]]&amp;lt;/tt&amp;gt;. Ratkaisu:&lt;br /&gt;
 $ echo moi | egrep &#039;m(o|a)i&#039;&lt;br /&gt;
 moi&lt;br /&gt;
&lt;br /&gt;
===== Laajennetut säännölliset lausekkeet: egrep =====&lt;br /&gt;
Esimerkissä käytettiin komentoa &amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;. Se on oikopolku grepin [[valitsin|valitsimelle]] &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;, joka ottaa säännöllisten lausekkeiden laajennetun (engl. extended) tuen käyttöön. Normaalissa käytössä (pelkkä komento &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) operaattorit &amp;lt;tt&amp;gt;? + {} | (&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; eivät ole käytettävissä, paitsi asettamalla niiden eteen pako-operaattorin &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Operaattoriella &amp;lt;tt&amp;gt;* . [] ^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; on sama erikoismerkitys sekä käytettäessä normaalia (&amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) että laajennettua (&amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;) syntaksia.&lt;br /&gt;
&lt;br /&gt;
===== Prosessoitu tuloste: awk =====&lt;br /&gt;
Jos ylläolevassa prosessilistausesimerkissä halutaan tulostaa pelkät prosessien [[PID]]-numerot, voidaan käyttää [[awk]]-työkalua seuraavasti:&lt;br /&gt;
 $ ps -ef | awk &#039;/^qmail/ { print $2 }&#039;&lt;br /&gt;
 3986&lt;br /&gt;
 3990&lt;br /&gt;
 3994&lt;br /&gt;
 3995&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä lausekkeista ==&lt;br /&gt;
Web-kuva:&lt;br /&gt;
 [^ ]+\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)&lt;br /&gt;
Päivämäärä muotoa pp.kk.vvvv:&lt;br /&gt;
 [0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}&lt;br /&gt;
2-merkkinen [[wikipedia:fi:heksadesimaalijärjestelmä|heksadesimaali]]:&lt;br /&gt;
 [0-9A-Fa-f]{2}&lt;br /&gt;
Sähköpostiosoite:&lt;br /&gt;
 [a-zA-Z0-9_]+@[a-zA-Z0-9_\.]+\.[a-zA-Z]{2,3}&lt;br /&gt;
&lt;br /&gt;
== Laajennukset ==&lt;br /&gt;
Lukuunottamatta operaattoria &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ja POSIX-luokkia (&amp;lt;tt&amp;gt;[[:luokka:]]&amp;lt;/tt&amp;gt; jne.) yllä esitetty on pitkälti universaalisti tuettua säännöllisten lausekkeiden eri toteutuksissa. Monissa toteutuksissa on kuitenkin tehty laajennuksia tähän, mutta esim. &amp;lt;tt&amp;gt;[[grep]]&amp;lt;/tt&amp;gt; ei tue seuraavia. &lt;br /&gt;
&lt;br /&gt;
=== Pakoluokat ===&lt;br /&gt;
Jos halutaan kirjoittaa lauseke, joka jossain kohtaa vastaa mitä tahansa numeromerkkiä, voidaan kirjoittaa hakasulkuilmaus &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;. Tälläisille yleisesti käytetyille luokille on kuitenkin olemassa laajennuksissa helpompia nimiä. Kutsutaan näitä &#039;&#039;pakoluokiksi&#039;&#039;. Ne muistuttavat läheisesti [[#POSIX-merkkiluokat|POSIX-merkkiluokkia]], mutta ovat lyhyempiä.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style: solid; border-collapse: collapse&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+&#039;&#039;&#039;Pakoluokat&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Ilmaisu !! Merkitys !! Vastaava hakasulkuilmaus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; || Mikä tahansa aakkonen a-z, numero tai alaviiva &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt;. || &amp;lt;tt&amp;gt;[a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\W&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa muu kuin aakkonen a-z, numero tai alaviiva. || &amp;lt;tt&amp;gt;[^a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; || Mikä tahansa tyhjä merkki (esim. välilyönti tai tabulaattori) || esim. &amp;lt;tt&amp;gt;[ \t]&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; tabulaattorimerkki&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-tyhjä merkki || esim. &amp;lt;tt&amp;gt;[^ \t]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; || Mikä tahansa numero. || &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\D&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-numero. || &amp;lt;tt&amp;gt;[^0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 \d+&lt;br /&gt;
vastaa siis kaikkia numeroita aivan siinä missä myös&lt;br /&gt;
 [0-9]+&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Grep]] ja [[Awk]]&lt;br /&gt;
** [[Putki]]&lt;br /&gt;
* [[Ed]] ja [[Sed]]: tuki säännöllisille lausekkeille&lt;br /&gt;
* [[Vi]] ja [[vim]]: näiden graaffinen tila&lt;br /&gt;
* [[Emacs]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[[wikipedia:fi:säännöllinen lauseke|Säännöllinen lauseke]]&lt;br /&gt;
*[[wikipedia:fi:äärellinen automaatti|Äärellinen automaatti]]&lt;br /&gt;
*[[wikipedia:fi:pinoautomaatti|Pinoautomaatti]]&lt;br /&gt;
*[[wikipedia:fi:turingin kone|Turingin kone]]&lt;br /&gt;
*[http://www.ohjelmointiputka.net/opas.php?tunnus=phpsl Säännölliset lausekkeet PHP:ssä] -opas Ohjelmointiputkassa&lt;br /&gt;
*[http://swtch.com/~rsc/regexp/regexp1.html Regular Expression Matching Can Be Simple And Fast]: Keskustelua säännöllisten lausekkeiden toteutuksesta C-kielellä englanniksi.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30778</id>
		<title>Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30778"/>
		<updated>2010-02-18T13:35:50Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: fix++&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Säännöllinen lauseke&#039;&#039;&#039; (engl. &#039;&#039;&#039;regular expression&#039;&#039;&#039;, &#039;&#039;&#039;regexp&#039;&#039;&#039;) on yksinkertainen merkkijonokieli, joka voi joko &#039;&#039;vastata&#039;&#039; tai &#039;&#039;olla vastaamatta&#039;&#039; jotain toista merkkijonoa.  Linux- ja Unix-järjestelmissä säännöllisiä lauskkeista on suurta hyötyä [[komentorivi]]ä käytettäessä esimerkiksi merkkijonojen etsimis- ja korvaustoiminnoissa. Niiden voidaankin sanoa olevan [[putki]]ttamiseen yhdistettynä tärkeimpiä työkaluja, joita komentorivin edistynyt käyttö edellyttää.&lt;br /&gt;
&lt;br /&gt;
Tässä artikkelissa on esitetty johdatus säännöllisiin lausekkeisiin siten, miten komentorivityöklu &amp;lt;tt&amp;gt;[[grep]]&amp;lt;/tt&amp;gt; ne ymmärtää &#039;&#039;laajennettussa&#039;&#039; (engl. extended) tilassa. Kaikissa säännöllisten lausekkeiden toteutuksissa syntaksi ei kuitenkaan ole aivan sama. Perusoperaattorit (&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;, sulut) ovat kuitenkin &#039;&#039;universaaleja&#039;&#039;, eli kaikki toteutukset tukevat niitä.&lt;br /&gt;
&lt;br /&gt;
Säännöllisistä lausekkeista on yleisesti käytössä kolme tyyppiä: &#039;&#039;tavallinen&#039;&#039; (engl. basic), &#039;&#039;laajennettu &#039;&#039;(engl. extended) ja &#039;&#039;[[Perl]]-tyyppinen&#039;&#039;. Varsinkin useassa järjestelmässä käytettäviä [[skripti|skriptejä]] kirjoitettaessa täytyy olla huolellinen, mikäli käyttää tavallisesta poikkeavia ilmaisuja. Tässä ohjeessa esitetty syntaksi on yhteensopiva Linuxin [[GNU]]-grepin laajennetun syntaksin kanssa jollei toisin mainita.&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita ei tule sekoittaa tiedostonimi-jokereihin (glob), joilla on samantapainen toiminnallisuus (vrt. &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;.*&amp;lt;/tt&amp;gt;). Tiedostonimijokereita ja säännöllisiä lausekkeita voi hydöyntää usein samoissa yhteyksissä, mutta säännölliset lausekkeet ovat tiedostonimijokereita ilmaisuvoimaisempia.&lt;br /&gt;
&lt;br /&gt;
== Teoriaa ==&lt;br /&gt;
[[wikipedia:fi:Tietojenkäsittelytiede|Tietojenkäsittelytieteessä]] säännölliset lausekkeet ymmärrettään [[wikipedia:fi:säännöllinen kieli|säännöllisestä kielenä]], joka voidaan tunnistaa [[wikipedia:fi:äärellinen automaatti|äärellisellä automaatilla]]. Säännöllisten lauskkeiden historia juontaa juurensa siten 50- ja 60-luvuille tietojenkäsittelytieteen syntyaikohiin.&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita voi hyödyntää monissa ohjelmointikielissä (mm. Perl, Java, Python, ECMAScript). Mille tahansa [[wikipedia:en:Turing complete|Turing-täydelliselle]] ohjelmointikielelle voidaan myös aina kirjoittaa säännöllisten lausekkeiden [[wikipedia:fi:Ohjelmointikielen tulkki|tulkki]].&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
Ensimmäisenä säännöllisten lausekkeiden toteutuksena aidolle tietokoneelle (IBM 7094) pidetään Unix-pioneeri [[wikipedia:fi:Ken Thompson|Ken Thompson]]in julkaisua [http://portal.acm.org/citation.cfm?doid=363347.363387 Regular Expression Search Algorithm] vuodelta 1968. [[Unix]]-järjestelmissä säännöllisiä lausekkeita on siten voinut hyödyntää aina ensimmäisistä versioista lähtien. Ensimmäinen [[grep]]-ohjelma kirjoitettiin ilmeisesti vuonna 1973.&amp;lt;sup&amp;gt;[http://www.columbia.edu/~rh120/ch001j.c11]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Johdatus säännöllisiin lausekkeisiin ==&lt;br /&gt;
&lt;br /&gt;
===Perusteet===&lt;br /&gt;
Säännöllinen lauseke joko &#039;&#039;vastaa&#039;&#039; tai &#039;&#039;ei vastaa&#039;&#039; merkkijonoa. Kutsutaan säännöllistä lauseketta &#039;&#039;lausekkeeksi&#039;&#039; ja merkkijonoa, jonka vastaavuus lausekkeeseen halutaan selvittää, &#039;&#039;kohteeksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lausekkeen yksinkertaiset kirjoitusmerkit vastaavat yksi-yhteen kohteen kirjoitusmerkkejä. Tämän vuoksi lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa yllätyksettömästi kohdetta&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei kohdetta&lt;br /&gt;
 bono&lt;br /&gt;
&lt;br /&gt;
Yleensä (mm. grep ja awk) katsotaan, että kohteen alussa ja lopussa voi olla mielivaltainen määrä ei-vastaavia merkkejä. Tällöin kohde (s.o. näiden komentojen tapauksessa jokin &#039;&#039;rivi&#039;&#039; jossain tiedostossa) vastaa lauseketta, jos edes jokin sen &#039;&#039;osa&#039;&#039; vastaa lauseketta. Siis grep ja awk -yhteydessä lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa kohdetta&lt;br /&gt;
 bo&#039;&#039;&#039;abba&#039;&#039;&#039;bo&lt;br /&gt;
ja&lt;br /&gt;
 dada&#039;&#039;&#039;abba&#039;&#039;&#039;gada&lt;br /&gt;
mutta ei silti kohdetta&lt;br /&gt;
 b&#039;&#039;&#039;abb&#039;&#039;&#039;bab&lt;br /&gt;
&lt;br /&gt;
===Operaattorit===&lt;br /&gt;
Yksi-yhteen vastaavien kirjoitusmerkkien lisäksi säännöllisissä lausekkeissa on mahdollisuus käyttää erilaisia &#039;&#039;operaattorimerkkejä&#039;&#039;, joilla on lausekkeessa erikoismerkitys.&lt;br /&gt;
&lt;br /&gt;
====Vaihtoehtoisuusoperaattori: &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Näistä ensimmäinen on operaattori &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;, joka tarkoittaa &#039;&#039;vaihtelua&#039;&#039; tai &#039;&#039;alternointia&#039;&#039; (engl. alternation). Sen merkitys on sama kuin luonnollisen kielen sanalla &amp;quot;tai&amp;quot;. Lauseke&lt;br /&gt;
 omena|luumu&lt;br /&gt;
vastaa sekä kohteita&lt;br /&gt;
 &#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
että&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;&lt;br /&gt;
Kun lisäksi muistamme yltä, että komentorivityökalujen tapauksessa kohde voi sisältää ei-vastaavia merkkejä sekä alussa että lopussa, vastaa ylläoleva lauseke &amp;lt;tt&amp;gt;omena|luumu&amp;lt;/tt&amp;gt; myös merkkijonoja&lt;br /&gt;
 uuni&#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
tai&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;soppa&lt;br /&gt;
Huomaa kuitenkin, että seuraavassa kohteessa vain ensimmäinen esiintymä vastaa lauseketta&lt;br /&gt;
 kotimainen &#039;&#039;&#039;omena&#039;&#039;&#039;-luumuhillo&lt;br /&gt;
&lt;br /&gt;
====Toisto-operaattorit====&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja ilmaisulla &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; on säännöllisissä lausekkeissa erikoismerkitys, joka vaikuttaa niitä &#039;&#039;välittömästi edeltävään&#039;&#039; merkkiin.&lt;br /&gt;
&lt;br /&gt;
=====Mielivaltaisen monta: &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, tai ei kertaakaan&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab*a&lt;br /&gt;
vastaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Todettakooon, että selvästi b-merkkien määrä kohteessa voi olla mielivaltainen, joten eri vastaavia kohdemerkkijonoja on olemassa myös ääretön määrä.&lt;br /&gt;
&lt;br /&gt;
=====Vähintään yksi: &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, mutta vähintään kerran&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab+a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====Ehdollinen: &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen kerran, tai ei kertaakaan&#039;&#039;&amp;quot;. Siten lauseke&lt;br /&gt;
 ab?a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bbbbbbbbbbbbbbbba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;ba&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====n:stä m:n kertaan: &amp;lt;tt&amp;gt;{n, m}&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Aina yllä olevat operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; eivät riitä, vaan jotain merkkiä tarvitsee vastata juuri tietyn määrän toistoja. Voitaisiin toki kirjoittaa&lt;br /&gt;
 aaaa?a?&lt;br /&gt;
jos halutaan vastata&lt;br /&gt;
 aaa&lt;br /&gt;
 aaaa&lt;br /&gt;
 aaaaa&lt;br /&gt;
mutta voidaan kirjoittaa lyhyemmin&lt;br /&gt;
 a{3,5}&lt;br /&gt;
Tämä tarkoittaa, että edeltävää merkkiä &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; voi esiintyä kolmesta viiteen kertaan. Käytetään yleisesti tästä ilmaisusta mallia &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; ovat mielivaltaisia kokonaislukuja, tarkoittaen &#039;&#039;&amp;quot;n:stä m:n kertaan&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Kumpi tahansa numeroista &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; voidaan jättää pois. Täten ilmaisu&lt;br /&gt;
 {n}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;tasan n kertaa&amp;quot;&#039;. Ilmaisu&lt;br /&gt;
 {n,}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;vähintään n kertaa&amp;quot;&#039;&#039;. Ilmaisu&lt;br /&gt;
 {,m}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;korkeintaan m kertaa&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sivuhuomatuksena todettakoon, että yllä olevan perusteella lyhyemmät operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; voitaisiin aina korvata ilmaisuilla &amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{1,}&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt; vastaavasti. {m,n}-muoto on kuitenkin uudempi laajennos, joka ei toimi kaikissa ohjelmassa.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Operaattori &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ei ole tuettu kaikissa säännöllisten lausekkeiden toteutuksissa. GNU grep tukee niitä laajennetussa tilassa (&amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===== Huomautuksia =====&lt;br /&gt;
Operaattoreita voi yhdistää mielivaltaisesti toisiinsa. Siten lauseke&lt;br /&gt;
 hur+a*!*&lt;br /&gt;
vastaavaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;hur&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurra&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa!&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurrraaa!!!!&#039;&#039;&#039;&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Toisaalta lauseke &#039;&#039;ei vastaa&#039;&#039; mitään seuraavista kohteista:&lt;br /&gt;
 burraa!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;aa!!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;uuurraa!!&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;urrur!!&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Tässä vaiheessa on hyvä varmistaa, että ymmärtää edellä esitetyn esimerkin kokonaisuudessaan.&lt;br /&gt;
&lt;br /&gt;
===Sulut: &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Kysymys:&#039;&#039;&#039; Jos halutaan vastata kohdetta &amp;lt;tt&amp;gt;hUrrUrrUrr&amp;lt;/tt&amp;gt; siten, että merkkijono &amp;lt;tt&amp;gt;Urr&amp;lt;/tt&amp;gt; voi esiintyä kohteessa äärettömän monta kertaa, miten tulee toimia?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vastaus:&#039;&#039;&#039; Tämä on mahdotonta tähän mennessä esitetyillä operaattoreilla. Voisimme toki kirjoittaa &amp;lt;tt&amp;gt;hU+r+r+&amp;lt;/tt&amp;gt; tai vastaavaa, mutta tämä vastaisi vain kohteita kuten &amp;lt;tt&amp;gt;hUUrrrr&amp;lt;/tt&amp;gt;. Tarvitsemme selvästi uuden operaattorin; &#039;&#039;sulut&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; voidaan määrittää lausekkeen osia, jotka samaan tapaan kuin koulumatematiikassa lasketaan &#039;&#039;ennen&#039;&#039; laskun muita osia. Koska säännöllisissä lausekkeissa ei kuitenkaan lasketa mitään, havainnollistetaan sulkujen merkitystä esittämällä ratkaisu yllä olevaan kysymykseen. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 h(Urr)+&lt;br /&gt;
vastaa kohteita&lt;br /&gt;
 &#039;&#039;&#039;hUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
jne. jne. Lauseke ei vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Arr&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Err&lt;br /&gt;
 burr&lt;br /&gt;
&lt;br /&gt;
Samoin kohde &lt;br /&gt;
 &#039;&#039;&#039;hUr&#039;&#039;&#039;&lt;br /&gt;
näyttää oikealta, mutta jää kuitenkin liian lyhyeksi, sillä sulkujen sisältö on löydyttävä kohteesta aina &#039;&#039;kokonaan&#039;&#039;. Siksi kohde &amp;lt;tt&amp;gt;hUr&amp;lt;/tt&amp;gt; &amp;lt;u&amp;gt;ei&amp;lt;/u&amp;gt; vastaa lauseketta &amp;lt;tt&amp;gt;h(Urr)+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Esimerkkejä====&lt;br /&gt;
&lt;br /&gt;
Sulkuja voi yhdistellä mielivaltaisesti kaikkiin operaattoreihin &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;. Seuraavassa on annettu sarja lausekkeita, sekä esimerkkejä kutakin vastaavista ja vastaamattomista kohteista:&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 d(ii)?pada+(pa|ba)?&lt;br /&gt;
vastaa esimerkiksi seuraavia kohteita&lt;br /&gt;
 &#039;&#039;&#039;diipadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista&lt;br /&gt;
 &#039;&#039;&#039;di&#039;&#039;&#039;padaapa&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;uu&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Viimeinen esimerkki jää lyhyeksi, sillä merkki &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; on lausekkeessa pakollinen vähintään kerran.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (hi|ha|ho)+&lt;br /&gt;
vastaa mitä tahansa kohdetta, jossa esiintyy mikä tahansa määrä merkkijonoja &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ha&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;ho&amp;lt;/tt&amp;gt; peräkkäin mielivaltaisen monta kertaa, kuitenkin vähintään kerran. Lauseke vastaa siis kaikkia seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;haha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hiha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hoho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihaho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hahohihohahi&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;e&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;u&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;uhu&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;ehe&lt;br /&gt;
&lt;br /&gt;
===Yhtä merkkiä vastaavat erikoismerkit===&lt;br /&gt;
Säännöllisissä lausekkeissa voi esiintyä myös joitain erikoismerkkejä, jotka eivät ole operaattoreita, eli ne eivät vaikuta niitä edeltäviin sulkuihin tai merkkeihin. Ne voitaisiin aina kirjoittaa lausekkeilla muotoa&lt;br /&gt;
 (merkki1|merkki2|merkki3|merkki4|...|merkkiN)&lt;br /&gt;
mutta tämä on varsin työlästä ja epäselkeää. Siksi säännöllisissä lausekkeissa on joitain erikoismerkkejä, jotka ovat oikopolkuja monimutkaisten vaihtoehtoisuuslausekkeiden kirjoittamiseen.&lt;br /&gt;
&lt;br /&gt;
====Jokerimerkki: &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Merkillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; (piste) on erikoismerkitys. Se vastaa aina &#039;&#039;mitä tahansa&#039;&#039; merkkiä. Lauseke&lt;br /&gt;
 .*&lt;br /&gt;
vastaa siis kaikkia mahdollisia kohteita - jopa tyhjää merkkijonoa, sillä operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa, että erikoisoperaattori &amp;quot;mikä tahansa merkki&amp;quot; voi esiintyä myös nolla kertaa. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (h.)+&lt;br /&gt;
vastaa siten kaikkia seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;he&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hy&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihrhy&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 rh&lt;br /&gt;
 ah&lt;br /&gt;
 oh&lt;br /&gt;
 ih&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;&lt;br /&gt;
Viimeinen esimerkki jää jälleen lyhyeksi, sillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; ei vastaa kuitenkaan &amp;quot;tyhjää&amp;quot; merkkiä.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 .upu&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
mutta myös&lt;br /&gt;
 &#039;&#039;&#039;supu&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 sepe&lt;br /&gt;
&lt;br /&gt;
====Merkkiluokat: &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan korjata ylläoleva Ankanpoika-esimerkki, voitaisiin kirjoittaa:&lt;br /&gt;
 (t|h|l|T|H|L)upu&lt;br /&gt;
joka vastaisi vain ja ainoastaan:&lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Merkkien &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; avulla voidaan määritellä kirjainluokkia siten, että seuraava merkki kohteessa vastaa vain ja ainoastaan jotain hakasulkujen välissä olevaa kirjainta. Siten äskeistä täysin vastaa lauseke on&lt;br /&gt;
 [thlTHL]upu&lt;br /&gt;
&lt;br /&gt;
Hakasulkujen välissä voidaan myös määritellä [[lokaali]]n aakkoston mukaisia välejä väliviivalla &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;. Tällöin &lt;br /&gt;
 19[4-9][0-9]|20[0-9][0-9]&lt;br /&gt;
vastaa kaikkia vuosilukuja välillä 1940-2099. Samoin &lt;br /&gt;
 Osasto [A-I]&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;Osasto A&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto B&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto C&#039;&#039;&#039;&lt;br /&gt;
 ...&lt;br /&gt;
 &#039;&#039;&#039;Osasto H&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto I&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;Osasto &#039;&#039;&#039;J&lt;br /&gt;
&lt;br /&gt;
On huomioitavaa, että myös kohteet ”Osasto b” tai ”Osasto È” saattavat vastata yllä esitettyä lausketta joissain [[lokaali|lokaaleissa]].&lt;br /&gt;
&lt;br /&gt;
Jos merkki &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; halutaan sisällyttää hakasulkuilmaisuun, se jätetään viimeiseksi. Esim.&lt;br /&gt;
 Ala[ -]aste&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;Ala aste&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Ala-aste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jos oikea hakasulku (&amp;lt;tt&amp;gt;]&amp;lt;/tt&amp;gt;) halutaan sisällyttää hakasulkuilmaukseen, se laitetaan hakasulkujen ensimmäiseksi merkiksi. Esim.&lt;br /&gt;
 []abcdef]+&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;b&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ab]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;d]f&#039;&#039;&#039;&lt;br /&gt;
jne., mutta ei&lt;br /&gt;
 [gi&lt;br /&gt;
 zo&lt;br /&gt;
&lt;br /&gt;
Hakasulkuilmaisusn merkitys voidaan kääntää asettamalla hattu &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; sen ensimmäiseksi merkiksi. Tällöin hakasulkuilmaisu vastaa mitä tahansa hakasuluissa &amp;lt;u&amp;gt;&#039;&#039;&#039;ei&#039;&#039;&#039;&amp;lt;/u&amp;gt; esiintyvää merkkiä kohteessa. Täten lauseke&lt;br /&gt;
 [^aeiouyåäö]+&lt;br /&gt;
vastaa mitä tahansa pelkistä konsonanteista, välimerkeistä ja numeroista koostuvaa kohdetta, kuten&lt;br /&gt;
 &#039;&#039;&#039;prrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;123&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hkr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;brr-hrr&#039;&#039;&#039;&lt;br /&gt;
jne. Mutta ei&lt;br /&gt;
 au&lt;br /&gt;
 aiai&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Grepin hyväksymissä säännöllisissä lausekkeissa merkin &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; voi sisällyttää hakasulkuilmaukseen laittamalla sen miksi tahansa muuksi merkiksi, kuin hakasulkujen ensimmäinen merkki. Tämä ei pidä välttämättä paikkaansa kuitenkaan kaikilla säännöllisten lausekkeiden toteutuksilla, vaan hattumerkin eteen on mahdollisesti laitettava pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=====POSIX-merkkiluokat=====&lt;br /&gt;
Joitain erikoismerkkiluokkia on määrätty ennakkoon grepissä. Esimerkiksi&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:digit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alpha:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alnum:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta tai numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:space:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa tyhjää (esim. välilyönti, tabulaattori) merkkiä&lt;br /&gt;
&lt;br /&gt;
Muita tällaisia ovat &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:lower:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:upper:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:xdigit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:blank:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:punct:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:print:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:cntrl:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:graph:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Merkkiluokat tulee laittaa lisäksi ulompien hakasulkujen &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; sisään. Esimerkiksi &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[[:upper:]]&amp;lt;/nowiki&amp;gt;+&lt;br /&gt;
joka vastaa yleensä ilmaisua&lt;br /&gt;
 [A-Z]+&lt;br /&gt;
eli mielivaltainen (vähintään yksi) määrä isoja kirjaimia A-Z.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Merkkiluokkia käytettäessä on huomioitava, että käytetty lokaali vaikuttaa ratkaisevasti siihen, mitä merkkejä luokkaan sisältyy. Siksi niitä ei voi käyttää tietoturvatarkistuksiin muuta kuin ennalta tiedetyillä lokaaleilla.&lt;br /&gt;
&lt;br /&gt;
====Pako-operaattori: &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan vastata jotain merkkiä, joka on määritelty operaattoriksi säännöllisissä lausekkeissa, sitä ei voida kirjoittaa sellaisenaan lausekkeeseen. Jos halutaan vastata tarkalleen jotain seuraavista&lt;br /&gt;
 Mitä?&lt;br /&gt;
 Missä?&lt;br /&gt;
 Milloin?&lt;br /&gt;
ei voida kirjoittaa lauseketta&lt;br /&gt;
 (Mi(tä|ssä|lloin))?&lt;br /&gt;
koska kysymysmerkki &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; lopussa vain ehdollista koko ulomman sulkuilmaisun, ja koko lauseke vastaisi siis vain joko tyhjää merkkijonoa tai kysymysmerkitöntä kysymyssanaa.&lt;br /&gt;
&lt;br /&gt;
Tarvitaan pako-operaattoria &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Merkin &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tai ylipäänsä minkä tahansa opraattorimerkin erikoismerkityksen voi poistaa asettamalla sen eteen kenoviivan. Tällöin kenoviivaa välittömästi seuraava merkki täytyy esiintyä kohteessa sellaisenaan. Oikea tapa kirjoittaa yllä oleva lauseke olisi siten&lt;br /&gt;
 (Mi(tä|ssä|lloin))\?&lt;br /&gt;
Tämä vastaa vain ja ainoastaan haluttuja merkkijonoja.&lt;br /&gt;
&lt;br /&gt;
Seuraavat operaattorit on merkittävä pako-operaattorilla, jos niitä ei haluta tulkittavan erikoismerkeiksi:&lt;br /&gt;
 ( ) | * + ? { } [ ] ^ $ \&lt;br /&gt;
&lt;br /&gt;
Siis, jos halutaan vastata kohteessa kenoviivaa, on kirjoitettava &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;. Esimerkiksi Windows-polku:&lt;br /&gt;
 &#039;&#039;&amp;lt;asema&amp;gt;&#039;&#039;:\Dokumentit\&#039;&#039;&amp;lt;nimi&amp;gt;&#039;&#039;.(doc, docx tai odt)&lt;br /&gt;
voidaan löytää esim. seuraavalla säännöllisellä lausekkeella:&lt;br /&gt;
 [A-Z]:\\Dokumentit\\[a-öA-Ö0-9 _-]+\.(doc|docx|odt)&lt;br /&gt;
&lt;br /&gt;
=== Rivin alku ja loppu: &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;===&lt;br /&gt;
On voinut herätä kysymys, kuinka voidaan vastata kohdetta (s.o. riviä) &#039;&#039;tarkalleen&#039;&#039;. Heti alussa selvisi, että esim grepin mielestä kohde (rivi) vastaa lauseketta, jos lauseke esiintyy missä tahansa kohdassa riviä. Jos halutaan, että lauseke vastaa alusta loppuun tarkalleen koko riviä, on otettava käyttöön erikoismerkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;. Nämä vastaavat kohteessa rivin tai merkkijonon alkua ja loppua kuvaavia &amp;quot;näkymättömiä&amp;quot; merkkejä vastaavasti. Siten&lt;br /&gt;
 ^abba$&lt;br /&gt;
vastaa vain riviä&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei esimerkiksi&lt;br /&gt;
 babba&lt;br /&gt;
 abbab&lt;br /&gt;
 babbab&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;abb&#039;&#039;&#039;bba&lt;br /&gt;
 ^abba&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;$&lt;br /&gt;
 ^abba$&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki ====&lt;br /&gt;
&lt;br /&gt;
Merkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; antavat viimeisen silauksen grepin tehokkaaseen hyödyntämiseen. Nyt esimerkiksi, jos tulostetaan kaikki [[prosessi]]t komennolla &amp;lt;tt&amp;gt;[[ps]] -ef&amp;lt;/tt&amp;gt;, saadaan yleensä jokseenkin tälläinen listaus (esimerkissä palvelinkone):&lt;br /&gt;
 &lt;br /&gt;
 $ ps -ef&lt;br /&gt;
 UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
 root         1     0  0 Jan21 ?        00:00:34 init [2]      &lt;br /&gt;
 root      1425     1  0 Jan31 ?        00:00:00 /usr/sbin/xinetd&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
 root      5566     1  0 Jan21 ?        00:00:05 /usr/sbin/apache2 -k start&lt;br /&gt;
 root      6091     1  0 Jan21 ?        00:00:03 /usr/sbin/cron&lt;br /&gt;
 www-data 15379  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 www-data 15386  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 root     21684 32395  0 20:37 ?        00:00:00 sshd: user [priv]&lt;br /&gt;
 user     21688 21684  0 20:37 ?        00:00:00 sshd: user@pts/1&lt;br /&gt;
 user     21689 21688  0 20:37 pts/1    00:00:00 -bash&lt;br /&gt;
 user     21705 21689  0 20:37 pts/1    00:00:00 ps -ef&lt;br /&gt;
 syslog   32279     1  0 Jan21 ?        00:00:07 /sbin/syslogd -u syslog&lt;br /&gt;
 bind     32351     1  0 Jan31 ?        00:00:00 /usr/sbin/named&lt;br /&gt;
 root     32395     1  0 Jan21 ?        00:00:22 /usr/sbin/sshd&lt;br /&gt;
 (... jne ...)&lt;br /&gt;
&lt;br /&gt;
Jos haluamme ylläolevasta listasta vain &amp;quot;qmail&amp;quot; -alkuisten [[käyttäjä|käyttäjien]] prosessit, voisimme [[putki]]ttaa syötteen grepille kirjoittamalla&lt;br /&gt;
 ps -ef | grep qmail&lt;br /&gt;
Tämä kuitenkin tulostaa myös kaikki sellaiset prosessit, joiden nimikentässä esiintyy &amp;quot;qmail&amp;quot; – joukossa myös käyttäjän [[root]] prosesseja vastoin alkuperäistä tarkoitusta:&lt;br /&gt;
 $ ps -ef | grep qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Ratkaisu qmail -alkuisten käyttäjien prosessien listaamiseen on:&lt;br /&gt;
 $ ps -ef | grep ^qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Hattumerkki &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; alussa vastaa jokaisen listausrivin alkua, jota pitää välittömästi seurata merkkijono &amp;lt;tt&amp;gt;qmail&amp;lt;/tt&amp;gt;, ja tämän jälkeen voi tulla mikä tahansa merkkejä, koska loppumerkkiä ei ole tarkoituksella annettu. Grep tulostaa vain lausketta vastaavat rivit, ja tulos on haluttu.&lt;br /&gt;
&lt;br /&gt;
===== Pako komentotulkista =====&lt;br /&gt;
Jos halutaan antaa jokin monimutkaisempi ilmaisu, on hyvä asettaa säännöllinen lauseke yksinkertaisten heittomerkkien &amp;lt;tt&amp;gt;&#039;&amp;lt;/tt&amp;gt; sisään, jotta ne regexp-operaattorit, joillla on jokin erikoismerkitys [[komentotulkki|komeotulkissa]] eivät aiheuta ongelmia.&lt;br /&gt;
 $ echo moi | egrep m(o|a)i&lt;br /&gt;
 -bash: syntax error near unexpected token `(&#039;&lt;br /&gt;
Sululla &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; on erikoismerkitys komentotulkissa, samoin merkillä &amp;lt;tt&amp;gt;[[putki||]]&amp;lt;/tt&amp;gt;. Ratkaisu:&lt;br /&gt;
 $ echo moi | egrep &#039;m(o|a)i&#039;&lt;br /&gt;
 moi&lt;br /&gt;
&lt;br /&gt;
===== Laajennetut säännölliset lausekkeet: egrep =====&lt;br /&gt;
Esimerkissä käytettiin komentoa &amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;. Se on oikopolku grepin [[valitsin|valitsimelle]] &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;, joka ottaa säännöllisten lausekkeiden laajennetun (engl. extended) tuen käyttöön. Normaalissa käytössä (pelkkä komento &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) operaattorit &amp;lt;tt&amp;gt;? + {} | (&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; eivät ole käytettävissä, paitsi asettamalla niiden eteen pako-operaattorin &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== Prosessoitu tuloste: awk =====&lt;br /&gt;
Jos ylläolevassa prosessilistausesimerkissä halutaan tulostaa pelkät prosessien [[PID]]-numerot, voidaan käyttää [[awk]]-työkalua seuraavasti:&lt;br /&gt;
 $ ps -ef | awk &#039;/^qmail/ { print $2 }&#039;&lt;br /&gt;
 3986&lt;br /&gt;
 3990&lt;br /&gt;
 3994&lt;br /&gt;
 3995&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä lausekkeista ==&lt;br /&gt;
Web-kuva:&lt;br /&gt;
 [^ ]+\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)&lt;br /&gt;
Päivämäärä muotoa pp.kk.vvvv:&lt;br /&gt;
 [0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}&lt;br /&gt;
2-merkkinen [[wikipedia:fi:heksadesimaalijärjestelmä|heksadesimaali]]:&lt;br /&gt;
 [0-9A-Fa-f]{2}&lt;br /&gt;
Sähköpostiosoite:&lt;br /&gt;
 [a-zA-Z0-9_]+@[a-zA-Z0-9_\.]+\.[a-zA-Z]{2,3}&lt;br /&gt;
&lt;br /&gt;
== Laajennukset ==&lt;br /&gt;
Lukuunottamatta operaattoria &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ja POSIX-luokkia (&amp;lt;tt&amp;gt;[[:luokka:]]&amp;lt;/tt&amp;gt; jne.) yllä esitetty on pitkälti universaalisti tuettua säännöllisten lausekkeiden eri toteutuksissa. Monissa toteutuksissa on kuitenkin tehty laajennuksia tähän, mutta esim. &amp;lt;tt&amp;gt;[[grep]]&amp;lt;/tt&amp;gt; ei tue seuraavia. &lt;br /&gt;
&lt;br /&gt;
=== Pakoluokat ===&lt;br /&gt;
Jos halutaan kirjoittaa lauseke, joka jossain kohtaa vastaa mitä tahansa numeromerkkiä, voidaan kirjoittaa hakasulkuilmaus &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;. Tälläisille yleisesti käytetyille luokille on kuitenkin olemassa laajennuksissa helpompia nimiä. Kutsutaan näitä &#039;&#039;pakoluokiksi&#039;&#039;. Ne muistuttavat läheisesti [[#POSIX-merkkiluokat|POSIX-merkkiluokkia]], mutta ovat lyhyempiä.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style: solid; border-collapse: collapse&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+&#039;&#039;&#039;Pakoluokat&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Ilmaisu !! Merkitys !! Vastaava hakasulkuilmaus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; || Mikä tahansa aakkonen a-z, numero tai alaviiva &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt;. || &amp;lt;tt&amp;gt;[a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\W&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa muu kuin aakkonen a-z, numero tai alaviiva. || &amp;lt;tt&amp;gt;[^a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; || Mikä tahansa tyhjä merkki (esim. välilyönti tai tabulaattori) || esim. &amp;lt;tt&amp;gt;[ \t]&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; tabulaattorimerkki&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-tyhjä merkki || esim. &amp;lt;tt&amp;gt;[^ \t]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; || Mikä tahansa numero. || &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\D&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-numero. || &amp;lt;tt&amp;gt;[^0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 \d+&lt;br /&gt;
vastaa siis kaikkia numeroita aivan siinä missä myös&lt;br /&gt;
 [0-9]+&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Grep]] ja [[Awk]]&lt;br /&gt;
** [[Putki]]&lt;br /&gt;
* [[Ed]] ja [[Sed]]: tuki säännöllisille lausekkeille&lt;br /&gt;
* [[Vi]] ja [[vim]]: näiden graaffinen tila&lt;br /&gt;
* [[Emacs]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[[wikipedia:fi:säännöllinen lauseke|Säännöllinen lauseke]]&lt;br /&gt;
*[[wikipedia:fi:äärellinen automaatti|Äärellinen automaatti]]&lt;br /&gt;
*[[wikipedia:fi:pinoautomaatti|Pinoautomaatti]]&lt;br /&gt;
*[[wikipedia:fi:turingin kone|Turingin kone]]&lt;br /&gt;
*[http://www.ohjelmointiputka.net/opas.php?tunnus=phpsl Säännölliset lausekkeet PHP:ssä] -opas Ohjelmointiputkassa&lt;br /&gt;
*[http://swtch.com/~rsc/regexp/regexp1.html Regular Expression Matching Can Be Simple And Fast]: Keskustelua säännöllisten lausekkeiden toteutuksesta C-kielellä englanniksi.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30773</id>
		<title>Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30773"/>
		<updated>2010-02-17T21:35:00Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: /* Teoriaa */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Säännöllinen lauseke&#039;&#039;&#039; (engl. &#039;&#039;&#039;regular expression&#039;&#039;&#039;, &#039;&#039;&#039;regexp&#039;&#039;&#039;) on yksinkertainen merkkijonokieli, joka voi joko &#039;&#039;vastata&#039;&#039; tai &#039;&#039;olla vastaamatta&#039;&#039; jotain toista merkkijonoa.  Linux- ja Unix-järjestelmissä säännöllisiä lauskkeista on suurta hyötyä [[komentorivi]]ä käytettäessä esimerkiksi merkkijonojen etsimis- ja korvaustoiminnoissa. Niiden voidaankin sanoa olevan [[putki]]ttamiseen yhdistettynä tärkeimpiä työkaluja, joita komentorivin edistynyt käyttö edellyttää.&lt;br /&gt;
&lt;br /&gt;
Tässä artikkelissa on esitetty johdatus säännöllisiin lausekkeisiin siten, miten komentorivityöklu &amp;lt;tt&amp;gt;[[grep]]&amp;lt;/tt&amp;gt; ne ymmärtää &#039;&#039;laajennettussa&#039;&#039; (engl. extended) tilassa. Kaikissa säännöllisten lausekkeiden toteutuksissa syntaksi ei kuitenkaan ole aivan sama. Perusoperaattorit (&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;, sulut) ovat kuitenkin &#039;&#039;universaaleja&#039;&#039;, eli kaikki toteutukset tukevat niitä.&lt;br /&gt;
&lt;br /&gt;
Säännöllisistä lausekkeista on yleisesti käytössä kolme tyyppiä: &#039;&#039;tavallinen&#039;&#039; (engl. basic), &#039;&#039;laajennettu &#039;&#039;(engl. extended) ja &#039;&#039;[[Perl]]-tyyppinen&#039;&#039;. Varsinkin useassa järjestelmässä käytettäviä [[skripti|skriptejä]] kirjoitettaessa täytyy olla huolellinen, mikäli käyttää tavallisesta poikkeavia ilmaisuja. Tässä ohjeessa esitetty syntaksi on yhteensopiva Linuxin [[GNU]]-grepin laajennetun syntaksin kanssa jollei toisin mainita.&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita ei pidä sekoittaa tiedostonimi-jokereihin ([[glob]]), joilla on samankaltainen toiminnallisuus (vrt. &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;.*&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Teoriaa ==&lt;br /&gt;
[[wikipedia:fi:Tietojenkäsittelytiede|Tietojenkäsittelytieteessä]] säännölliset lausekkeet ymmärrettään [[wikipedia:fi:säännöllinen kieli|säännöllisestä kielenä]], joka voidaan tunnistaa [[wikipedia:fi:äärellinen automaatti|äärellisellä automaatilla]]. Säännöllisten lauskkeiden historia juontaa juurensa siten 50- ja 60-luvuille tietojenkäsittelytieteen syntyaikohiin.&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita voi hyödyntää monissa ohjelmointikielissä (mm. Perl, Java, Python, ECMAScript). Mille tahansa [[wikipedia:en:Turing complete|Turing-täydelliselle]] ohjelmointikielelle voidaan myös aina kirjoittaa säännöllisten lausekkeiden [[wikipedia:fi:Ohjelmointikielen tulkki|tulkki]].&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
Ensimmäisenä säännöllisten lausekkeiden toteutuksena aidolle tietokoneelle (IBM 7094) pidetään Unix-pioneeri [[wikipedia:fi:Ken Thompson|Ken Thompson]]in julkaisua [http://portal.acm.org/citation.cfm?doid=363347.363387 Regular Expression Search Algorithm] vuodelta 1968. [[Unix]]-järjestelmissä säännöllisiä lausekkeita on siten voinut hyödyntää aina ensimmäisistä versioista lähtien. Ensimmäinen [[grep]]-ohjelma kirjoitettiin ilmeisesti vuonna 1973.&amp;lt;sup&amp;gt;[http://www.columbia.edu/~rh120/ch001j.c11]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Johdatus säännöllisiin lausekkeisiin ==&lt;br /&gt;
&lt;br /&gt;
===Perusteet===&lt;br /&gt;
Säännöllinen lauseke joko &#039;&#039;vastaa&#039;&#039; tai &#039;&#039;ei vastaa&#039;&#039; merkkijonoa. Kutsutaan säännöllistä lauseketta &#039;&#039;lausekkeeksi&#039;&#039; ja merkkijonoa, jonka vastaavuus lausekkeeseen halutaan selvittää, &#039;&#039;kohteeksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lausekkeen yksinkertaiset kirjoitusmerkit vastaavat yksi-yhteen kohteen kirjoitusmerkkejä. Tämän vuoksi lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa yllätyksettömästi kohdetta&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei kohdetta&lt;br /&gt;
 bono&lt;br /&gt;
&lt;br /&gt;
Yleensä (mm. grep ja awk) katsotaan, että kohteen alussa ja lopussa voi olla mielivaltainen määrä ei-vastaavia merkkejä. Tällöin kohde (s.o. näiden komentojen tapauksessa &#039;&#039;rivi&#039;&#039;) vastaa lauseketta, jos edes jokin sen &#039;&#039;osa&#039;&#039; vastaa lauseketta. Siis grep ja awk -yhteydessä lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa kohdetta&lt;br /&gt;
 bo&#039;&#039;&#039;abba&#039;&#039;&#039;bo&lt;br /&gt;
ja&lt;br /&gt;
 dada&#039;&#039;&#039;abba&#039;&#039;&#039;gada&lt;br /&gt;
mutta ei silti kohdetta&lt;br /&gt;
 b&#039;&#039;&#039;abb&#039;&#039;&#039;bab&lt;br /&gt;
&lt;br /&gt;
===Operaattorit===&lt;br /&gt;
Yksi-yhteen vastaavien kirjoitusmerkkien lisäksi säännöllisissä lausekkeissa on mahdollisuus käyttää erilaisia &#039;&#039;operaattorimerkkejä&#039;&#039;, joilla on lausekkeessa erikoismerkitys.&lt;br /&gt;
&lt;br /&gt;
====Vaihtoehtoisuusoperaattori: &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Näistä ensimmäinen on operaattori &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;, joka tarkoittaa &#039;&#039;vaihtelua&#039;&#039; tai &#039;&#039;alternointia&#039;&#039; (engl. alternation). Sen merkitys on sama kuin luonnollisen kielen sanalla &amp;quot;tai&amp;quot;. Lauseke&lt;br /&gt;
 omena|luumu&lt;br /&gt;
vastaa sekä kohteita&lt;br /&gt;
 &#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
että&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;&lt;br /&gt;
Kun lisäksi muistamme yltä, että komentorivityökalujen tapauksessa kohde voi sisältää ei-vastaavia merkkejä sekä alussa että lopussa, vastaa ylläoleva lauseke &amp;lt;tt&amp;gt;omena|luumu&amp;lt;/tt&amp;gt; myös merkkijonoja&lt;br /&gt;
 uuni&#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
tai&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;soppa&lt;br /&gt;
Huomaa kuitenkin, että seuraavassa kohteessa vain ensimmäinen esiintymä vastaa lauseketta&lt;br /&gt;
 kotimainen &#039;&#039;&#039;omena&#039;&#039;&#039;-luumuhillo&lt;br /&gt;
&lt;br /&gt;
====Toisto-operaattorit====&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja ilmaisulla &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; on säännöllisissä lausekkeissa erikoismerkitys, joka vaikuttaa niitä &#039;&#039;välittömästi edeltävään&#039;&#039; merkkiin.&lt;br /&gt;
&lt;br /&gt;
=====Mielivaltaisen monta: &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, tai ei kertaakaan&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab*a&lt;br /&gt;
vastaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Todettakooon, että selvästi b-merkkien määrä kohteessa voi olla mielivaltainen, joten eri vastaavia kohdemerkkijonoja on olemassa myös ääretön määrä.&lt;br /&gt;
&lt;br /&gt;
=====Vähintään yksi: &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, mutta vähintään kerran&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab+a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====Ehdollinen: &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen kerran, tai ei kertaakaan&#039;&#039;&amp;quot;. Siten lauseke&lt;br /&gt;
 ab?a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bbbbbbbbbbbbbbbba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;ba&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====n:stä m:n kertaan: &amp;lt;tt&amp;gt;{n, m}&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Aina yllä olevat operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; eivät riitä, vaan jotain merkkiä tarvitsee vastata juuri tietyn määrän toistoja. Voitaisiin toki kirjoittaa&lt;br /&gt;
 aaaa?a?&lt;br /&gt;
jos halutaan vastata&lt;br /&gt;
 aaa&lt;br /&gt;
 aaaa&lt;br /&gt;
 aaaaa&lt;br /&gt;
mutta voidaan kirjoittaa lyhyemmin&lt;br /&gt;
 a{3,5}&lt;br /&gt;
Tämä tarkoittaa, että edeltävää merkkiä &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; voi esiintyä kolmesta viiteen kertaan. Käytetään yleisesti tästä ilmaisusta mallia &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; ovat mielivaltaisia kokonaislukuja, tarkoittaen &#039;&#039;&amp;quot;n:stä m:n kertaan&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Kumpi tahansa numeroista &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; voidaan jättää pois. Täten ilmaisu&lt;br /&gt;
 {n}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;tasan n kertaa&amp;quot;&#039;. Ilmaisu&lt;br /&gt;
 {n,}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;vähintään n kertaa&amp;quot;&#039;&#039;. Ilmaisu&lt;br /&gt;
 {,m}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;korkeintaan m kertaa&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sivuhuomatuksena todettakoon, että yllä olevan perusteella lyhyemmät operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; voitaisiin aina korvata ilmaisuilla &amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{1,}&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt; vastaavasti. {m,n}-muoto on kuitenkin uudempi laajennos, joka ei toimi kaikissa ohjelmassa.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Operaattori &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ei ole tuettu kaikissa säännöllisten lausekkeiden toteutuksissa. GNU grep tukee niitä laajennetussa tilassa (&amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===== Huomautuksia =====&lt;br /&gt;
Operaattoreita voi yhdistää mielivaltaisesti toisiinsa. Siten lauseke&lt;br /&gt;
 hur+a*!*&lt;br /&gt;
vastaavaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;hur&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurra&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa!&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurrraaa!!!!&#039;&#039;&#039;&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Toisaalta lauseke &#039;&#039;ei vastaa&#039;&#039; mitään seuraavista kohteista:&lt;br /&gt;
 burraa!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;aa!!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;uuurraa!!&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;urrur!!&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Tässä vaiheessa on hyvä varmistaa, että ymmärtää edellä esitetyn esimerkin kokonaisuudessaan.&lt;br /&gt;
&lt;br /&gt;
===Sulut: &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Kysymys:&#039;&#039;&#039; Jos halutaan vastata kohdetta &amp;lt;tt&amp;gt;hUrrUrrUrr&amp;lt;/tt&amp;gt; siten, että merkkijono &amp;lt;tt&amp;gt;Urr&amp;lt;/tt&amp;gt; voi esiintyä kohteessa äärettömän monta kertaa, miten tulee toimia?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vastaus:&#039;&#039;&#039; Tämä on mahdotonta tähän mennessä esitetyillä operaattoreilla. Voisimme toki kirjoittaa &amp;lt;tt&amp;gt;hU+r+r+&amp;lt;/tt&amp;gt; tai vastaavaa, mutta tämä vastaisi vain kohteita kuten &amp;lt;tt&amp;gt;hUUrrrr&amp;lt;/tt&amp;gt;. Tarvitsemme selvästi uuden operaattorin; &#039;&#039;sulut&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; voidaan määrittää lausekkeen osia, jotka samaan tapaan kuin koulumatematiikassa lasketaan &#039;&#039;ennen&#039;&#039; laskun muita osia. Koska säännöllisissä lausekkeissa ei kuitenkaan lasketa mitään, havainnollistetaan sulkujen merkitystä esittämällä ratkaisu yllä olevaan kysymykseen. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 h(Urr)+&lt;br /&gt;
vastaa kohteita&lt;br /&gt;
 &#039;&#039;&#039;hUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
jne. jne. Lauseke ei vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Arr&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Err&lt;br /&gt;
 burr&lt;br /&gt;
&lt;br /&gt;
Samoin kohde &lt;br /&gt;
 &#039;&#039;&#039;hUr&#039;&#039;&#039;&lt;br /&gt;
näyttää oikealta, mutta jää kuitenkin liian lyhyeksi, sillä sulkujen sisältö on löydyttävä kohteesta aina &#039;&#039;kokonaan&#039;&#039;. Siksi kohde &amp;lt;tt&amp;gt;hUr&amp;lt;/tt&amp;gt; &amp;lt;u&amp;gt;ei&amp;lt;/u&amp;gt; vastaa lauseketta &amp;lt;tt&amp;gt;h(Urr)+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Esimerkkejä====&lt;br /&gt;
&lt;br /&gt;
Sulkuja voi yhdistellä mielivaltaisesti kaikkiin operaattoreihin &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;. Seuraavassa on annettu sarja lausekkeita, sekä esimerkkejä kutakin vastaavista ja vastaamattomista kohteista:&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 d(ii)?pada+(pa|ba)?&lt;br /&gt;
vastaa esimerkiksi seuraavia kohteita&lt;br /&gt;
 &#039;&#039;&#039;diipadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista&lt;br /&gt;
 &#039;&#039;&#039;di&#039;&#039;&#039;padaapa&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;uu&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Viimeinen esimerkki jää lyhyeksi, sillä merkki &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; on lausekkeessa pakollinen vähintään kerran.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (hi|ha|ho)+&lt;br /&gt;
vastaa mitä tahansa kohdetta, jossa esiintyy mikä tahansa määrä merkkijonoja &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ha&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;ho&amp;lt;/tt&amp;gt; peräkkäin mielivaltaisen monta kertaa, kuitenkin vähintään kerran. Lauseke vastaa siis kaikkia seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;haha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hiha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hoho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihaho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hahohihohahi&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;e&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;u&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;uhu&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;ehe&lt;br /&gt;
&lt;br /&gt;
===Yhtä merkkiä vastaavat erikoismerkit===&lt;br /&gt;
Säännöllisissä lausekkeissa voi esiintyä myös joitain erikoismerkkejä, jotka eivät ole operaattoreita, eli ne eivät vaikuta niitä edeltäviin sulkuihin tai merkkeihin. Ne voitaisiin aina kirjoittaa lausekkeilla muotoa&lt;br /&gt;
 (merkki1|merkki2|merkki3|merkki4|...|merkkiN)&lt;br /&gt;
mutta tämä on varsin työlästä ja epäselkeää. Siksi säännöllisissä lausekkeissa on joitain erikoismerkkejä, jotka ovat oikopolkuja monimutkaisten vaihtoehtoisuuslausekkeiden kirjoittamiseen.&lt;br /&gt;
&lt;br /&gt;
====Jokerimerkki: &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Merkillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; (piste) on erikoismerkitys. Se vastaa aina &#039;&#039;mitä tahansa&#039;&#039; merkkiä. Lauseke&lt;br /&gt;
 .*&lt;br /&gt;
vastaa siis kaikkia mahdollisia kohteita - jopa tyhjää merkkijonoa, sillä operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa, että erikoisoperaattori &amp;quot;mikä tahansa merkki&amp;quot; voi esiintyä myös nolla kertaa. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (h.)+&lt;br /&gt;
vastaa siten kaikkia seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;he&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hy&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihrhy&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 rh&lt;br /&gt;
 ah&lt;br /&gt;
 oh&lt;br /&gt;
 ih&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;&lt;br /&gt;
Viimeinen esimerkki jää jälleen lyhyeksi, sillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; ei vastaa kuitenkaan &amp;quot;tyhjää&amp;quot; merkkiä.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 .upu&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
mutta myös&lt;br /&gt;
 &#039;&#039;&#039;supu&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 sepe&lt;br /&gt;
&lt;br /&gt;
====Merkkiluokat: &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan korjata ylläoleva Ankanpoika-esimerkki, voitaisiin kirjoittaa:&lt;br /&gt;
 (t|h|l|T|H|L)upu&lt;br /&gt;
joka vastaisi vain ja ainoastaan:&lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Merkkien &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; avulla voidaan määritellä kirjainluokkia siten, että seuraava merkki kohteessa vastaa vain ja ainoastaan jotain hakasulkujen välissä olevaa kirjainta. Siten äskeistä täysin vastaa lauseke on&lt;br /&gt;
 [thlTHL]upu&lt;br /&gt;
&lt;br /&gt;
Hakasulkujen välissä voidaan myös määritellä [[lokaali]]n aakkoston mukaisia välejä väliviivalla &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;. Tällöin &lt;br /&gt;
 19[4-9][0-9]|20[0-9][0-9]&lt;br /&gt;
vastaa kaikkia vuosilukuja välillä 1940-2099. Samoin &lt;br /&gt;
 Osasto [A-I]&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;Osasto A&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto B&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto C&#039;&#039;&#039;&lt;br /&gt;
 ...&lt;br /&gt;
 &#039;&#039;&#039;Osasto H&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto I&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;Osasto &#039;&#039;&#039;J&lt;br /&gt;
&lt;br /&gt;
On huomioitavaa, että myös kohteet ”Osasto b” tai ”Osasto È” saattavat vastata yllä esitettyä lausketta joissain [[lokaali|lokaaleissa]].&lt;br /&gt;
&lt;br /&gt;
Jos merkki &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; halutaan sisällyttää hakasulkuilmaisuun, se jätetään viimeiseksi. Esim.&lt;br /&gt;
 Ala[ -]aste&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;Ala aste&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Ala-aste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jos oikea hakasulku (&amp;lt;tt&amp;gt;]&amp;lt;/tt&amp;gt;) halutaan sisällyttää hakasulkuilmaukseen, se laitetaan hakasulkujen ensimmäiseksi merkiksi. Esim.&lt;br /&gt;
 []abcdef]+&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;b&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ab]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;d]f&#039;&#039;&#039;&lt;br /&gt;
jne., mutta ei&lt;br /&gt;
 [gi&lt;br /&gt;
 zo&lt;br /&gt;
&lt;br /&gt;
Hakasulkuilmaisusn merkitys voidaan kääntää asettamalla hattu &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; sen ensimmäiseksi merkiksi. Tällöin hakasulkuilmaisu vastaa mitä tahansa hakasuluissa &amp;lt;u&amp;gt;&#039;&#039;&#039;ei&#039;&#039;&#039;&amp;lt;/u&amp;gt; esiintyvää merkkiä kohteessa. Täten lauseke&lt;br /&gt;
 [^aeiouyåäö]+&lt;br /&gt;
vastaa mitä tahansa pelkistä konsonanteista, välimerkeistä ja numeroista koostuvaa kohdetta, kuten&lt;br /&gt;
 &#039;&#039;&#039;prrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;123&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hkr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;brr-hrr&#039;&#039;&#039;&lt;br /&gt;
jne. Mutta ei&lt;br /&gt;
 au&lt;br /&gt;
 aiai&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Grepin hyväksymissä säännöllisissä lausekkeissa merkin &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; voi sisällyttää hakasulkuilmaukseen laittamalla sen miksi tahansa muuksi merkiksi, kuin hakasulkujen ensimmäinen merkki. Tämä ei pidä välttämättä paikkaansa kuitenkaan kaikilla säännöllisten lausekkeiden toteutuksilla, vaan hattumerkin eteen on mahdollisesti laitettava pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=====POSIX-merkkiluokat=====&lt;br /&gt;
Joitain erikoismerkkiluokkia on määrätty ennakkoon grepissä. Esimerkiksi&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:digit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alpha:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alnum:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta tai numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:space:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa tyhjää (esim. välilyönti, tabulaattori) merkkiä&lt;br /&gt;
&lt;br /&gt;
Muita tällaisia ovat &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:lower:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:upper:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:xdigit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:blank:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:punct:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:print:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:cntrl:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:graph:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Merkkiluokat tulee laittaa lisäksi ulompien hakasulkujen &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; sisään. Esimerkiksi &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[[:upper:]]&amp;lt;/nowiki&amp;gt;+&lt;br /&gt;
joka vastaa yleensä ilmaisua&lt;br /&gt;
 [A-Z]+&lt;br /&gt;
eli mielivaltainen (vähintään yksi) määrä isoja kirjaimia A-Z.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Merkkiluokkia käytettäessä on huomioitava, että käytetty lokaali vaikuttaa ratkaisevasti siihen, mitä merkkejä luokkaan sisältyy. Siksi niitä ei voi käyttää tietoturvatarkistuksiin muuta kuin ennalta tiedetyillä lokaaleilla.&lt;br /&gt;
&lt;br /&gt;
====Pako-operaattori: &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan vastata jotain merkkiä, joka on määritelty operaattoriksi säännöllisissä lausekkeissa, sitä ei voida kirjoittaa sellaisenaan lausekkeeseen. Jos halutaan vastata tarkalleen jotain seuraavista&lt;br /&gt;
 Mitä?&lt;br /&gt;
 Missä?&lt;br /&gt;
 Milloin?&lt;br /&gt;
ei voida kirjoittaa lauseketta&lt;br /&gt;
 (Mi(tä|ssä|lloin))?&lt;br /&gt;
koska kysymysmerkki &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; lopussa vain ehdollista koko ulomman sulkuilmaisun, ja koko lauseke vastaisi siis vain joko tyhjää merkkijonoa tai kysymysmerkitöntä kysymyssanaa.&lt;br /&gt;
&lt;br /&gt;
Tarvitaan pako-operaattoria &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Merkin &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tai ylipäänsä minkä tahansa opraattorimerkin erikoismerkityksen voi poistaa asettamalla sen eteen kenoviivan. Tällöin kenoviivaa välittömästi seuraava merkki täytyy esiintyä kohteessa sellaisenaan. Oikea tapa kirjoittaa yllä oleva lauseke olisi siten&lt;br /&gt;
 (Mi(tä|ssä|lloin))\?&lt;br /&gt;
Tämä vastaa vain ja ainoastaan haluttuja merkkijonoja.&lt;br /&gt;
&lt;br /&gt;
Seuraavat operaattorit on merkittävä pako-operaattorilla, jos niitä ei haluta tulkittavan erikoismerkeiksi:&lt;br /&gt;
 ( ) | * + ? { } [ ] ^ $ \&lt;br /&gt;
&lt;br /&gt;
Siis, jos halutaan vastata kohteessa kenoviivaa, on kirjoitettava &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;. Esimerkiksi Windows-polku:&lt;br /&gt;
 &#039;&#039;&amp;lt;asema&amp;gt;&#039;&#039;:\Dokumentit\&#039;&#039;&amp;lt;nimi&amp;gt;&#039;&#039;.(doc, docx tai odt)&lt;br /&gt;
voidaan löytää esim. seuraavalla säännöllisellä lausekkeella:&lt;br /&gt;
 [A-Z]:\\Dokumentit\\[a-öA-Ö0-9 _-]+\.(doc|docx|odt)&lt;br /&gt;
&lt;br /&gt;
=== Rivin alku ja loppu: &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;===&lt;br /&gt;
On voinut herätä kysymys, kuinka voidaan vastata kohdetta (s.o. riviä) &#039;&#039;tarkalleen&#039;&#039;. Heti alussa selvisi, että esim grepin mielestä kohde (rivi) vastaa lauseketta, jos lauseke esiintyy missä tahansa kohdassa riviä. Jos halutaan, että lauseke vastaa alusta loppuun tarkalleen koko riviä, on otettava käyttöön erikoismerkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;. Nämä vastaavat kohteessa rivin tai merkkijonon alkua ja loppua kuvaavia &amp;quot;näkymättömiä&amp;quot; merkkejä vastaavasti. Siten&lt;br /&gt;
 ^abba$&lt;br /&gt;
vastaa vain riviä&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei esimerkiksi&lt;br /&gt;
 babba&lt;br /&gt;
 abbab&lt;br /&gt;
 babbab&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;abb&#039;&#039;&#039;bba&lt;br /&gt;
 ^abba&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;$&lt;br /&gt;
 ^abba$&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki ====&lt;br /&gt;
&lt;br /&gt;
Merkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; antavat viimeisen silauksen grepin tehokkaaseen hyödyntämiseen. Nyt esimerkiksi, jos tulostetaan kaikki [[prosessi]]t komennolla &amp;lt;tt&amp;gt;[[ps]] -ef&amp;lt;/tt&amp;gt;, saadaan yleensä jokseenkin tälläinen listaus (esimerkissä palvelinkone):&lt;br /&gt;
 &lt;br /&gt;
 $ ps -ef&lt;br /&gt;
 UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
 root         1     0  0 Jan21 ?        00:00:34 init [2]      &lt;br /&gt;
 root      1425     1  0 Jan31 ?        00:00:00 /usr/sbin/xinetd&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
 root      5566     1  0 Jan21 ?        00:00:05 /usr/sbin/apache2 -k start&lt;br /&gt;
 root      6091     1  0 Jan21 ?        00:00:03 /usr/sbin/cron&lt;br /&gt;
 www-data 15379  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 www-data 15386  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 root     21684 32395  0 20:37 ?        00:00:00 sshd: user [priv]&lt;br /&gt;
 user     21688 21684  0 20:37 ?        00:00:00 sshd: user@pts/1&lt;br /&gt;
 user     21689 21688  0 20:37 pts/1    00:00:00 -bash&lt;br /&gt;
 user     21705 21689  0 20:37 pts/1    00:00:00 ps -ef&lt;br /&gt;
 syslog   32279     1  0 Jan21 ?        00:00:07 /sbin/syslogd -u syslog&lt;br /&gt;
 bind     32351     1  0 Jan31 ?        00:00:00 /usr/sbin/named&lt;br /&gt;
 root     32395     1  0 Jan21 ?        00:00:22 /usr/sbin/sshd&lt;br /&gt;
 (... jne ...)&lt;br /&gt;
&lt;br /&gt;
Jos haluamme ylläolevasta listasta vain &amp;quot;qmail&amp;quot; -alkuisten [[käyttäjä|käyttäjien]] prosessit, voisimme kirjoittaa&lt;br /&gt;
 ps -ef | grep qmail&lt;br /&gt;
Tämä kuitenkin tulostaa myös kaikki sellaiset prosessit, joiden nimikentässä esiintyy &amp;quot;qmail&amp;quot; – joukossa myös käyttäjän [[root]] prosesseja vastoin alkuperäistä tarkoitusta:&lt;br /&gt;
 $ ps -ef | grep qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger &#039;&#039;&#039;qmail&#039;&#039;&#039; 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-clean&lt;br /&gt;
&lt;br /&gt;
Ratkaisu qmail -alkuisten käyttäjien prosessien listaamiseen on:&lt;br /&gt;
 $ ps -ef | grep ^qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Hattumerkki &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; alussa vastaa jokaisen listausrivin alkua, jota pitää välittömästi seurata merkkijono &amp;lt;tt&amp;gt;qmail&amp;lt;/tt&amp;gt;, ja tämän jälkeen voi tulla mikä tahansa merkkejä, koska loppumerkkiä ei ole tarkoituksella annettu. Grep tulostaa vain lausketta vastaavat rivit, ja tulos on haluttu.&lt;br /&gt;
&lt;br /&gt;
===== Pako komentotulkista =====&lt;br /&gt;
Jos halutaan antaa jokin monimutkaisempi ilmaisu, on hyvä asettaa säännöllinen lauseke yksinkertaisten heittomerkkien &amp;lt;tt&amp;gt;&#039;&amp;lt;/tt&amp;gt; sisään, jotta ne regexp-operaattorit, joillla on jokin erikoismerkitys [[komentotulkki|komeotulkissa]] eivät aiheuta ongelmia.&lt;br /&gt;
 $ echo moi | egrep m(o|a)i&lt;br /&gt;
 -bash: syntax error near unexpected token `(&#039;&lt;br /&gt;
Sululla &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; on erikoismerkitys komentotulkissa, samoin merkillä &amp;lt;tt&amp;gt;[[putki||]]&amp;lt;/tt&amp;gt;. Ratkaisu:&lt;br /&gt;
 $ echo moi | egrep &#039;m(o|a)i&#039;&lt;br /&gt;
 moi&lt;br /&gt;
&lt;br /&gt;
===== Laajennetut säännölliset lausekkeet: egrep =====&lt;br /&gt;
Esimerkissä käytettiin komentoa &amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;. Se on oikopolku grepin [[valitsin|valitsimelle]] &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;, joka ottaa säännöllisten lausekkeiden laajennetun (engl. extended) tuen käyttöön. Normaalissa käytössä (pelkkä komento &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) operaattorit &amp;lt;tt&amp;gt;? + {} | (&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; eivät ole käytettävissä, paitsi asettamalla niiden eteen pako-operaattorin &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== Prosessoitu tuloste: awk =====&lt;br /&gt;
Jos ylläolevassa prosessilistausesimerkissä halutaan tulostaa pelkät prosessien [[PID]]-numerot, voidaan käyttää [[awk]]-työkalua seuraavasti:&lt;br /&gt;
 $ ps -ef | awk &#039;/^qmail/ { print $2 }&#039;&lt;br /&gt;
 3986&lt;br /&gt;
 3990&lt;br /&gt;
 3994&lt;br /&gt;
 3995&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä lausekkeista ==&lt;br /&gt;
Web-kuva:&lt;br /&gt;
 [^ ]+\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)&lt;br /&gt;
Päivämäärä muotoa pp.kk.vvvv:&lt;br /&gt;
 [0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}&lt;br /&gt;
2-merkkinen [[wikipedia:fi:heksadesimaalijärjestelmä|heksadesimaali]]:&lt;br /&gt;
 [0-9A-Fa-f]{2}&lt;br /&gt;
Sähköpostiosoite:&lt;br /&gt;
 [a-zA-Z0-9_]+@[a-zA-Z0-9_\.]+\.[a-zA-Z]{2,3}&lt;br /&gt;
&lt;br /&gt;
== Laajennukset ==&lt;br /&gt;
Lukuunottamatta operaattoria &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ja POSIX-luokkia (&amp;lt;tt&amp;gt;[[:luokka:]]&amp;lt;/tt&amp;gt; jne.) yllä esitetty on pitkälti universaalisti tuettua säännöllisten lausekkeiden eri toteutuksissa. Monissa toteutuksissa on kuitenkin tehty laajennuksia tähän, mutta esim. [[grep]] ei tue seuraavia. &lt;br /&gt;
&lt;br /&gt;
=== Pakoluokat ===&lt;br /&gt;
Jos halutaan kirjoittaa lauseke, joka jossain kohtaa vastaa mitä tahansa numeromerkkiä, voidaan kirjoittaa hakasulkuilmaus &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;. Tälläisille yleisesti käytetyille luokille on kuitenkin olemassa laajennuksissa helpompia nimiä. Kutsutaan näitä &#039;&#039;pakoluokiksi&#039;&#039;. Ne muistuttavat läheisesti [[#POSIX-merkkiluokat|POSIX-merkkiluokkia]], mutta ovat lyhyempiä.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style: solid; border-collapse: collapse&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+&#039;&#039;&#039;Pakoluokat&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Ilmaisu !! Merkitys !! Vastaava hakasulkuilmaus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; || Mikä tahansa aakkonen a-z, numero tai alaviiva &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt;. || &amp;lt;tt&amp;gt;[a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\W&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa muu kuin aakkonen a-z, numero tai alaviiva. || &amp;lt;tt&amp;gt;[^a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; || Mikä tahansa tyhjä merkki (esim. välilyönti tai tabulaattori) || esim. &amp;lt;tt&amp;gt;[ \t]&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; tabulaattorimerkki&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-tyhjä merkki || esim. &amp;lt;tt&amp;gt;[^ \t]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; || Mikä tahansa numero. || &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\D&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-numero. || &amp;lt;tt&amp;gt;[^0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 \d+&lt;br /&gt;
vastaa siis kaikkia numeroita aivan siinä missä myös&lt;br /&gt;
 [0-9]+&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Grep]] ja [[Awk]]&lt;br /&gt;
** [[Putki]]&lt;br /&gt;
* [[Ed]] ja [[Sed]]: tuki säännöllisille lausekkeille&lt;br /&gt;
* [[Vi]] ja [[vim]]: näiden graaffinen tila&lt;br /&gt;
* [[Emacs]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[[wikipedia:fi:säännöllinen lauseke|Säännöllinen lauseke]]&lt;br /&gt;
*[[wikipedia:fi:äärellinen automaatti|Äärellinen automaatti]]&lt;br /&gt;
*[[wikipedia:fi:pinoautomaatti|Pinoautomaatti]]&lt;br /&gt;
*[[wikipedia:fi:turingin kone|Turingin kone]]&lt;br /&gt;
*[http://www.ohjelmointiputka.net/opas.php?tunnus=phpsl Säännölliset lausekkeet PHP:ssä] -opas Ohjelmointiputkassa&lt;br /&gt;
*[http://swtch.com/~rsc/regexp/regexp1.html Regular Expression Matching Can Be Simple And Fast]: Keskustelua säännöllisten lausekkeiden toteutuksesta C-kielellä englanniksi.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30772</id>
		<title>Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30772"/>
		<updated>2010-02-17T17:16:12Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: /* Teoriaa */ erotettu historia-osio. laajennettu.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Säännöllinen lauseke&#039;&#039;&#039; (engl. &#039;&#039;&#039;regular expression&#039;&#039;&#039;, &#039;&#039;&#039;regexp&#039;&#039;&#039;) on yksinkertainen merkkijonokieli, joka voi joko &#039;&#039;vastata&#039;&#039; tai &#039;&#039;olla vastaamatta&#039;&#039; jotain toista merkkijonoa.  Linux- ja Unix-järjestelmissä säännöllisiä lauskkeista on suurta hyötyä [[komentorivi]]ä käytettäessä esimerkiksi merkkijonojen etsimis- ja korvaustoiminnoissa. Niiden voidaankin sanoa olevan [[putki]]ttamiseen yhdistettynä tärkeimpiä työkaluja, joita komentorivin edistynyt käyttö edellyttää.&lt;br /&gt;
&lt;br /&gt;
Tässä artikkelissa on esitetty johdatus säännöllisiin lausekkeisiin siten, miten komentorivityöklu &amp;lt;tt&amp;gt;[[grep]]&amp;lt;/tt&amp;gt; ne ymmärtää &#039;&#039;laajennettussa&#039;&#039; (engl. extended) tilassa. Kaikissa säännöllisten lausekkeiden toteutuksissa syntaksi ei kuitenkaan ole aivan sama. Perusoperaattorit (&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;, sulut) ovat kuitenkin &#039;&#039;universaaleja&#039;&#039;, eli kaikki toteutukset tukevat niitä.&lt;br /&gt;
&lt;br /&gt;
Säännöllisistä lausekkeista on yleisesti käytössä kolme tyyppiä: &#039;&#039;tavallinen&#039;&#039; (engl. basic), &#039;&#039;laajennettu &#039;&#039;(engl. extended) ja &#039;&#039;[[Perl]]-tyyppinen&#039;&#039;. Varsinkin useassa järjestelmässä käytettäviä [[skripti|skriptejä]] kirjoitettaessa täytyy olla huolellinen, mikäli käyttää tavallisesta poikkeavia ilmaisuja. Tässä ohjeessa esitetty syntaksi on yhteensopiva Linuxin [[GNU]]-grepin laajennetun syntaksin kanssa jollei toisin mainita.&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita ei pidä sekoittaa tiedostonimi-jokereihin ([[glob]]), joilla on samankaltainen toiminnallisuus (vrt. &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;.*&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Teoriaa ==&lt;br /&gt;
[[wikipedia:fi:Tietojenkäsittelytiede|Tietojenkäsittelytieteessä]] säännölliset lausekkeet ymmärrettään [[wikipedia:fi:säännöllinen kieli|säännöllisestä kielena]], joka voidaan tunnistaa [[wikipedia:fi:äärellinen automaatti|äärellisellä automaatilla]]. Säännöllisten lauskkeiden historia juontaa juurensa siten 50- ja 60-luvuille tietojenkäsittelytieteen syntyaikohiin.&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita voi hyödyntää monissa ohjelmointikielissä (mm. Perl, Java, Python, ECMAScript). Mille tahansa [[wikipedia:en:Turing complete|Turing-täydelliselle]] ohjelmointikielelle voidaan myös aina kirjoittaa säännöllisten lausekkeiden [[wikipedia:fi:Ohjelmointikielen tulkki|tulkki]].&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
Ensimmäisenä säännöllisten lausekkeiden toteutuksena aidolle tietokoneelle (IBM 7094) pidetään Unix-pioneeri [[wikipedia:fi:Ken Thompson|Ken Thompson]]in julkaisua [http://portal.acm.org/citation.cfm?doid=363347.363387 Regular Expression Search Algorithm] vuodelta 1968. [[Unix]]-järjestelmissä säännöllisiä lausekkeita on siten voinut hyödyntää aina ensimmäisistä versioista lähtien. Ensimmäinen [[grep]]-ohjelma kirjoitettiin ilmeisesti vuonna 1973.&amp;lt;sup&amp;gt;[http://www.columbia.edu/~rh120/ch001j.c11]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Johdatus säännöllisiin lausekkeisiin ==&lt;br /&gt;
&lt;br /&gt;
===Perusteet===&lt;br /&gt;
Säännöllinen lauseke joko &#039;&#039;vastaa&#039;&#039; tai &#039;&#039;ei vastaa&#039;&#039; merkkijonoa. Kutsutaan säännöllistä lauseketta &#039;&#039;lausekkeeksi&#039;&#039; ja merkkijonoa, jonka vastaavuus lausekkeeseen halutaan selvittää, &#039;&#039;kohteeksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lausekkeen yksinkertaiset kirjoitusmerkit vastaavat yksi-yhteen kohteen kirjoitusmerkkejä. Tämän vuoksi lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa yllätyksettömästi kohdetta&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei kohdetta&lt;br /&gt;
 bono&lt;br /&gt;
&lt;br /&gt;
Yleensä (mm. grep ja awk) katsotaan, että kohteen alussa ja lopussa voi olla mielivaltainen määrä ei-vastaavia merkkejä. Tällöin kohde (s.o. näiden komentojen tapauksessa &#039;&#039;rivi&#039;&#039;) vastaa lauseketta, jos edes jokin sen &#039;&#039;osa&#039;&#039; vastaa lauseketta. Siis grep ja awk -yhteydessä lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa kohdetta&lt;br /&gt;
 bo&#039;&#039;&#039;abba&#039;&#039;&#039;bo&lt;br /&gt;
ja&lt;br /&gt;
 dada&#039;&#039;&#039;abba&#039;&#039;&#039;gada&lt;br /&gt;
mutta ei silti kohdetta&lt;br /&gt;
 b&#039;&#039;&#039;abb&#039;&#039;&#039;bab&lt;br /&gt;
&lt;br /&gt;
===Operaattorit===&lt;br /&gt;
Yksi-yhteen vastaavien kirjoitusmerkkien lisäksi säännöllisissä lausekkeissa on mahdollisuus käyttää erilaisia &#039;&#039;operaattorimerkkejä&#039;&#039;, joilla on lausekkeessa erikoismerkitys.&lt;br /&gt;
&lt;br /&gt;
====Vaihtoehtoisuusoperaattori: &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Näistä ensimmäinen on operaattori &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;, joka tarkoittaa &#039;&#039;vaihtelua&#039;&#039; tai &#039;&#039;alternointia&#039;&#039; (engl. alternation). Sen merkitys on sama kuin luonnollisen kielen sanalla &amp;quot;tai&amp;quot;. Lauseke&lt;br /&gt;
 omena|luumu&lt;br /&gt;
vastaa sekä kohteita&lt;br /&gt;
 &#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
että&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;&lt;br /&gt;
Kun lisäksi muistamme yltä, että komentorivityökalujen tapauksessa kohde voi sisältää ei-vastaavia merkkejä sekä alussa että lopussa, vastaa ylläoleva lauseke &amp;lt;tt&amp;gt;omena|luumu&amp;lt;/tt&amp;gt; myös merkkijonoja&lt;br /&gt;
 uuni&#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
tai&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;soppa&lt;br /&gt;
Huomaa kuitenkin, että seuraavassa kohteessa vain ensimmäinen esiintymä vastaa lauseketta&lt;br /&gt;
 kotimainen &#039;&#039;&#039;omena&#039;&#039;&#039;-luumuhillo&lt;br /&gt;
&lt;br /&gt;
====Toisto-operaattorit====&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja ilmaisulla &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; on säännöllisissä lausekkeissa erikoismerkitys, joka vaikuttaa niitä &#039;&#039;välittömästi edeltävään&#039;&#039; merkkiin.&lt;br /&gt;
&lt;br /&gt;
=====Mielivaltaisen monta: &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, tai ei kertaakaan&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab*a&lt;br /&gt;
vastaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Todettakooon, että selvästi b-merkkien määrä kohteessa voi olla mielivaltainen, joten eri vastaavia kohdemerkkijonoja on olemassa myös ääretön määrä.&lt;br /&gt;
&lt;br /&gt;
=====Vähintään yksi: &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, mutta vähintään kerran&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab+a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====Ehdollinen: &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen kerran, tai ei kertaakaan&#039;&#039;&amp;quot;. Siten lauseke&lt;br /&gt;
 ab?a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bbbbbbbbbbbbbbbba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;ba&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====n:stä m:n kertaan: &amp;lt;tt&amp;gt;{n, m}&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Aina yllä olevat operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; eivät riitä, vaan jotain merkkiä tarvitsee vastata juuri tietyn määrän toistoja. Voitaisiin toki kirjoittaa&lt;br /&gt;
 aaaa?a?&lt;br /&gt;
jos halutaan vastata&lt;br /&gt;
 aaa&lt;br /&gt;
 aaaa&lt;br /&gt;
 aaaaa&lt;br /&gt;
mutta voidaan kirjoittaa lyhyemmin&lt;br /&gt;
 a{3,5}&lt;br /&gt;
Tämä tarkoittaa, että edeltävää merkkiä &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; voi esiintyä kolmesta viiteen kertaan. Käytetään yleisesti tästä ilmaisusta mallia &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; ovat mielivaltaisia kokonaislukuja, tarkoittaen &#039;&#039;&amp;quot;n:stä m:n kertaan&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Kumpi tahansa numeroista &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; voidaan jättää pois. Täten ilmaisu&lt;br /&gt;
 {n}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;tasan n kertaa&amp;quot;&#039;. Ilmaisu&lt;br /&gt;
 {n,}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;vähintään n kertaa&amp;quot;&#039;&#039;. Ilmaisu&lt;br /&gt;
 {,m}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;korkeintaan m kertaa&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sivuhuomatuksena todettakoon, että yllä olevan perusteella lyhyemmät operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; voitaisiin aina korvata ilmaisuilla &amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{1,}&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt; vastaavasti. {m,n}-muoto on kuitenkin uudempi laajennos, joka ei toimi kaikissa ohjelmassa.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Operaattori &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ei ole tuettu kaikissa säännöllisten lausekkeiden toteutuksissa. GNU grep tukee niitä laajennetussa tilassa (&amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===== Huomautuksia =====&lt;br /&gt;
Operaattoreita voi yhdistää mielivaltaisesti toisiinsa. Siten lauseke&lt;br /&gt;
 hur+a*!*&lt;br /&gt;
vastaavaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;hur&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurra&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa!&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurrraaa!!!!&#039;&#039;&#039;&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Toisaalta lauseke &#039;&#039;ei vastaa&#039;&#039; mitään seuraavista kohteista:&lt;br /&gt;
 burraa!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;aa!!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;uuurraa!!&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;urrur!!&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Tässä vaiheessa on hyvä varmistaa, että ymmärtää edellä esitetyn esimerkin kokonaisuudessaan.&lt;br /&gt;
&lt;br /&gt;
===Sulut: &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Kysymys:&#039;&#039;&#039; Jos halutaan vastata kohdetta &amp;lt;tt&amp;gt;hUrrUrrUrr&amp;lt;/tt&amp;gt; siten, että merkkijono &amp;lt;tt&amp;gt;Urr&amp;lt;/tt&amp;gt; voi esiintyä kohteessa äärettömän monta kertaa, miten tulee toimia?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vastaus:&#039;&#039;&#039; Tämä on mahdotonta tähän mennessä esitetyillä operaattoreilla. Voisimme toki kirjoittaa &amp;lt;tt&amp;gt;hU+r+r+&amp;lt;/tt&amp;gt; tai vastaavaa, mutta tämä vastaisi vain kohteita kuten &amp;lt;tt&amp;gt;hUUrrrr&amp;lt;/tt&amp;gt;. Tarvitsemme selvästi uuden operaattorin; &#039;&#039;sulut&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; voidaan määrittää lausekkeen osia, jotka samaan tapaan kuin koulumatematiikassa lasketaan &#039;&#039;ennen&#039;&#039; laskun muita osia. Koska säännöllisissä lausekkeissa ei kuitenkaan lasketa mitään, havainnollistetaan sulkujen merkitystä esittämällä ratkaisu yllä olevaan kysymykseen. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 h(Urr)+&lt;br /&gt;
vastaa kohteita&lt;br /&gt;
 &#039;&#039;&#039;hUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
jne. jne. Lauseke ei vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Arr&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Err&lt;br /&gt;
 burr&lt;br /&gt;
&lt;br /&gt;
Samoin kohde &lt;br /&gt;
 &#039;&#039;&#039;hUr&#039;&#039;&#039;&lt;br /&gt;
näyttää oikealta, mutta jää kuitenkin liian lyhyeksi, sillä sulkujen sisältö on löydyttävä kohteesta aina &#039;&#039;kokonaan&#039;&#039;. Siksi kohde &amp;lt;tt&amp;gt;hUr&amp;lt;/tt&amp;gt; &amp;lt;u&amp;gt;ei&amp;lt;/u&amp;gt; vastaa lauseketta &amp;lt;tt&amp;gt;h(Urr)+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Esimerkkejä====&lt;br /&gt;
&lt;br /&gt;
Sulkuja voi yhdistellä mielivaltaisesti kaikkiin operaattoreihin &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;. Seuraavassa on annettu sarja lausekkeita, sekä esimerkkejä kutakin vastaavista ja vastaamattomista kohteista:&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 d(ii)?pada+(pa|ba)?&lt;br /&gt;
vastaa esimerkiksi seuraavia kohteita&lt;br /&gt;
 &#039;&#039;&#039;diipadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista&lt;br /&gt;
 &#039;&#039;&#039;di&#039;&#039;&#039;padaapa&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;uu&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Viimeinen esimerkki jää lyhyeksi, sillä merkki &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; on lausekkeessa pakollinen vähintään kerran.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (hi|ha|ho)+&lt;br /&gt;
vastaa mitä tahansa kohdetta, jossa esiintyy mikä tahansa määrä merkkijonoja &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ha&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;ho&amp;lt;/tt&amp;gt; peräkkäin mielivaltaisen monta kertaa, kuitenkin vähintään kerran. Lauseke vastaa siis kaikkia seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;haha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hiha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hoho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihaho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hahohihohahi&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;e&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;u&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;uhu&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;ehe&lt;br /&gt;
&lt;br /&gt;
===Yhtä merkkiä vastaavat erikoismerkit===&lt;br /&gt;
Säännöllisissä lausekkeissa voi esiintyä myös joitain erikoismerkkejä, jotka eivät ole operaattoreita, eli ne eivät vaikuta niitä edeltäviin sulkuihin tai merkkeihin. Ne voitaisiin aina kirjoittaa lausekkeilla muotoa&lt;br /&gt;
 (merkki1|merkki2|merkki3|merkki4|...|merkkiN)&lt;br /&gt;
mutta tämä on varsin työlästä ja epäselkeää. Siksi säännöllisissä lausekkeissa on joitain erikoismerkkejä, jotka ovat oikopolkuja monimutkaisten vaihtoehtoisuuslausekkeiden kirjoittamiseen.&lt;br /&gt;
&lt;br /&gt;
====Jokerimerkki: &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Merkillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; (piste) on erikoismerkitys. Se vastaa aina &#039;&#039;mitä tahansa&#039;&#039; merkkiä. Lauseke&lt;br /&gt;
 .*&lt;br /&gt;
vastaa siis kaikkia mahdollisia kohteita - jopa tyhjää merkkijonoa, sillä operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa, että erikoisoperaattori &amp;quot;mikä tahansa merkki&amp;quot; voi esiintyä myös nolla kertaa. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (h.)+&lt;br /&gt;
vastaa siten kaikkia seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;he&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hy&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihrhy&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 rh&lt;br /&gt;
 ah&lt;br /&gt;
 oh&lt;br /&gt;
 ih&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;&lt;br /&gt;
Viimeinen esimerkki jää jälleen lyhyeksi, sillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; ei vastaa kuitenkaan &amp;quot;tyhjää&amp;quot; merkkiä.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 .upu&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
mutta myös&lt;br /&gt;
 &#039;&#039;&#039;supu&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 sepe&lt;br /&gt;
&lt;br /&gt;
====Merkkiluokat: &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan korjata ylläoleva Ankanpoika-esimerkki, voitaisiin kirjoittaa:&lt;br /&gt;
 (t|h|l|T|H|L)upu&lt;br /&gt;
joka vastaisi vain ja ainoastaan:&lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Merkkien &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; avulla voidaan määritellä kirjainluokkia siten, että seuraava merkki kohteessa vastaa vain ja ainoastaan jotain hakasulkujen välissä olevaa kirjainta. Siten äskeistä täysin vastaa lauseke on&lt;br /&gt;
 [thlTHL]upu&lt;br /&gt;
&lt;br /&gt;
Hakasulkujen välissä voidaan myös määritellä [[lokaali]]n aakkoston mukaisia välejä väliviivalla &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;. Tällöin &lt;br /&gt;
 19[4-9][0-9]|20[0-9][0-9]&lt;br /&gt;
vastaa kaikkia vuosilukuja välillä 1940-2099. Samoin &lt;br /&gt;
 Osasto [A-I]&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;Osasto A&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto B&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto C&#039;&#039;&#039;&lt;br /&gt;
 ...&lt;br /&gt;
 &#039;&#039;&#039;Osasto H&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto I&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;Osasto &#039;&#039;&#039;J&lt;br /&gt;
&lt;br /&gt;
On huomioitavaa, että myös kohteet ”Osasto b” tai ”Osasto È” saattavat vastata yllä esitettyä lausketta joissain [[lokaali|lokaaleissa]].&lt;br /&gt;
&lt;br /&gt;
Jos merkki &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; halutaan sisällyttää hakasulkuilmaisuun, se jätetään viimeiseksi. Esim.&lt;br /&gt;
 Ala[ -]aste&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;Ala aste&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Ala-aste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jos oikea hakasulku (&amp;lt;tt&amp;gt;]&amp;lt;/tt&amp;gt;) halutaan sisällyttää hakasulkuilmaukseen, se laitetaan hakasulkujen ensimmäiseksi merkiksi. Esim.&lt;br /&gt;
 []abcdef]+&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;b&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ab]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;d]f&#039;&#039;&#039;&lt;br /&gt;
jne., mutta ei&lt;br /&gt;
 [gi&lt;br /&gt;
 zo&lt;br /&gt;
&lt;br /&gt;
Hakasulkuilmaisusn merkitys voidaan kääntää asettamalla hattu &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; sen ensimmäiseksi merkiksi. Tällöin hakasulkuilmaisu vastaa mitä tahansa hakasuluissa &amp;lt;u&amp;gt;&#039;&#039;&#039;ei&#039;&#039;&#039;&amp;lt;/u&amp;gt; esiintyvää merkkiä kohteessa. Täten lauseke&lt;br /&gt;
 [^aeiouyåäö]+&lt;br /&gt;
vastaa mitä tahansa pelkistä konsonanteista, välimerkeistä ja numeroista koostuvaa kohdetta, kuten&lt;br /&gt;
 &#039;&#039;&#039;prrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;123&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hkr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;brr-hrr&#039;&#039;&#039;&lt;br /&gt;
jne. Mutta ei&lt;br /&gt;
 au&lt;br /&gt;
 aiai&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Grepin hyväksymissä säännöllisissä lausekkeissa merkin &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; voi sisällyttää hakasulkuilmaukseen laittamalla sen miksi tahansa muuksi merkiksi, kuin hakasulkujen ensimmäinen merkki. Tämä ei pidä välttämättä paikkaansa kuitenkaan kaikilla säännöllisten lausekkeiden toteutuksilla, vaan hattumerkin eteen on mahdollisesti laitettava pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=====POSIX-merkkiluokat=====&lt;br /&gt;
Joitain erikoismerkkiluokkia on määrätty ennakkoon grepissä. Esimerkiksi&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:digit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alpha:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alnum:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta tai numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:space:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa tyhjää (esim. välilyönti, tabulaattori) merkkiä&lt;br /&gt;
&lt;br /&gt;
Muita tällaisia ovat &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:lower:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:upper:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:xdigit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:blank:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:punct:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:print:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:cntrl:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:graph:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Merkkiluokat tulee laittaa lisäksi ulompien hakasulkujen &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; sisään. Esimerkiksi &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[[:upper:]]&amp;lt;/nowiki&amp;gt;+&lt;br /&gt;
joka vastaa yleensä ilmaisua&lt;br /&gt;
 [A-Z]+&lt;br /&gt;
eli mielivaltainen (vähintään yksi) määrä isoja kirjaimia A-Z.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Merkkiluokkia käytettäessä on huomioitava, että käytetty lokaali vaikuttaa ratkaisevasti siihen, mitä merkkejä luokkaan sisältyy. Siksi niitä ei voi käyttää tietoturvatarkistuksiin muuta kuin ennalta tiedetyillä lokaaleilla.&lt;br /&gt;
&lt;br /&gt;
====Pako-operaattori: &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan vastata jotain merkkiä, joka on määritelty operaattoriksi säännöllisissä lausekkeissa, sitä ei voida kirjoittaa sellaisenaan lausekkeeseen. Jos halutaan vastata tarkalleen jotain seuraavista&lt;br /&gt;
 Mitä?&lt;br /&gt;
 Missä?&lt;br /&gt;
 Milloin?&lt;br /&gt;
ei voida kirjoittaa lauseketta&lt;br /&gt;
 (Mi(tä|ssä|lloin))?&lt;br /&gt;
koska kysymysmerkki &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; lopussa vain ehdollista koko ulomman sulkuilmaisun, ja koko lauseke vastaisi siis vain joko tyhjää merkkijonoa tai kysymysmerkitöntä kysymyssanaa.&lt;br /&gt;
&lt;br /&gt;
Tarvitaan pako-operaattoria &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Merkin &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tai ylipäänsä minkä tahansa opraattorimerkin erikoismerkityksen voi poistaa asettamalla sen eteen kenoviivan. Tällöin kenoviivaa välittömästi seuraava merkki täytyy esiintyä kohteessa sellaisenaan. Oikea tapa kirjoittaa yllä oleva lauseke olisi siten&lt;br /&gt;
 (Mi(tä|ssä|lloin))\?&lt;br /&gt;
Tämä vastaa vain ja ainoastaan haluttuja merkkijonoja.&lt;br /&gt;
&lt;br /&gt;
Seuraavat operaattorit on merkittävä pako-operaattorilla, jos niitä ei haluta tulkittavan erikoismerkeiksi:&lt;br /&gt;
 ( ) | * + ? { } [ ] ^ $ \&lt;br /&gt;
&lt;br /&gt;
Siis, jos halutaan vastata kohteessa kenoviivaa, on kirjoitettava &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;. Esimerkiksi Windows-polku:&lt;br /&gt;
 &#039;&#039;&amp;lt;asema&amp;gt;&#039;&#039;:\Dokumentit\&#039;&#039;&amp;lt;nimi&amp;gt;&#039;&#039;.(doc, docx tai odt)&lt;br /&gt;
voidaan löytää esim. seuraavalla säännöllisellä lausekkeella:&lt;br /&gt;
 [A-Z]:\\Dokumentit\\[a-öA-Ö0-9 _-]+\.(doc|docx|odt)&lt;br /&gt;
&lt;br /&gt;
=== Rivin alku ja loppu: &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;===&lt;br /&gt;
On voinut herätä kysymys, kuinka voidaan vastata kohdetta (s.o. riviä) &#039;&#039;tarkalleen&#039;&#039;. Heti alussa selvisi, että esim grepin mielestä kohde (rivi) vastaa lauseketta, jos lauseke esiintyy missä tahansa kohdassa riviä. Jos halutaan, että lauseke vastaa alusta loppuun tarkalleen koko riviä, on otettava käyttöön erikoismerkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;. Nämä vastaavat kohteessa rivin tai merkkijonon alkua ja loppua kuvaavia &amp;quot;näkymättömiä&amp;quot; merkkejä vastaavasti. Siten&lt;br /&gt;
 ^abba$&lt;br /&gt;
vastaa vain riviä&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei esimerkiksi&lt;br /&gt;
 babba&lt;br /&gt;
 abbab&lt;br /&gt;
 babbab&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;abb&#039;&#039;&#039;bba&lt;br /&gt;
 ^abba&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;$&lt;br /&gt;
 ^abba$&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki ====&lt;br /&gt;
&lt;br /&gt;
Merkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; antavat viimeisen silauksen grepin tehokkaaseen hyödyntämiseen. Nyt esimerkiksi, jos tulostetaan kaikki [[prosessi]]t komennolla &amp;lt;tt&amp;gt;[[ps]] -ef&amp;lt;/tt&amp;gt;, saadaan yleensä jokseenkin tälläinen listaus (esimerkissä palvelinkone):&lt;br /&gt;
 &lt;br /&gt;
 $ ps -ef&lt;br /&gt;
 UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
 root         1     0  0 Jan21 ?        00:00:34 init [2]      &lt;br /&gt;
 root      1425     1  0 Jan31 ?        00:00:00 /usr/sbin/xinetd&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
 root      5566     1  0 Jan21 ?        00:00:05 /usr/sbin/apache2 -k start&lt;br /&gt;
 root      6091     1  0 Jan21 ?        00:00:03 /usr/sbin/cron&lt;br /&gt;
 www-data 15379  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 www-data 15386  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 root     21684 32395  0 20:37 ?        00:00:00 sshd: user [priv]&lt;br /&gt;
 user     21688 21684  0 20:37 ?        00:00:00 sshd: user@pts/1&lt;br /&gt;
 user     21689 21688  0 20:37 pts/1    00:00:00 -bash&lt;br /&gt;
 user     21705 21689  0 20:37 pts/1    00:00:00 ps -ef&lt;br /&gt;
 syslog   32279     1  0 Jan21 ?        00:00:07 /sbin/syslogd -u syslog&lt;br /&gt;
 bind     32351     1  0 Jan31 ?        00:00:00 /usr/sbin/named&lt;br /&gt;
 root     32395     1  0 Jan21 ?        00:00:22 /usr/sbin/sshd&lt;br /&gt;
 (... jne ...)&lt;br /&gt;
&lt;br /&gt;
Jos haluamme ylläolevasta listasta vain &amp;quot;qmail&amp;quot; -alkuisten [[käyttäjä|käyttäjien]] prosessit, voisimme kirjoittaa&lt;br /&gt;
 ps -ef | grep qmail&lt;br /&gt;
Tämä kuitenkin tulostaa myös kaikki sellaiset prosessit, joiden nimikentässä esiintyy &amp;quot;qmail&amp;quot; – joukossa myös käyttäjän [[root]] prosesseja vastoin alkuperäistä tarkoitusta:&lt;br /&gt;
 $ ps -ef | grep qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger &#039;&#039;&#039;qmail&#039;&#039;&#039; 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-clean&lt;br /&gt;
&lt;br /&gt;
Ratkaisu qmail -alkuisten käyttäjien prosessien listaamiseen on:&lt;br /&gt;
 $ ps -ef | grep ^qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Hattumerkki &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; alussa vastaa jokaisen listausrivin alkua, jota pitää välittömästi seurata merkkijono &amp;lt;tt&amp;gt;qmail&amp;lt;/tt&amp;gt;, ja tämän jälkeen voi tulla mikä tahansa merkkejä, koska loppumerkkiä ei ole tarkoituksella annettu. Grep tulostaa vain lausketta vastaavat rivit, ja tulos on haluttu.&lt;br /&gt;
&lt;br /&gt;
===== Pako komentotulkista =====&lt;br /&gt;
Jos halutaan antaa jokin monimutkaisempi ilmaisu, on hyvä asettaa säännöllinen lauseke yksinkertaisten heittomerkkien &amp;lt;tt&amp;gt;&#039;&amp;lt;/tt&amp;gt; sisään, jotta ne regexp-operaattorit, joillla on jokin erikoismerkitys [[komentotulkki|komeotulkissa]] eivät aiheuta ongelmia.&lt;br /&gt;
 $ echo moi | egrep m(o|a)i&lt;br /&gt;
 -bash: syntax error near unexpected token `(&#039;&lt;br /&gt;
Sululla &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; on erikoismerkitys komentotulkissa, samoin merkillä &amp;lt;tt&amp;gt;[[putki||]]&amp;lt;/tt&amp;gt;. Ratkaisu:&lt;br /&gt;
 $ echo moi | egrep &#039;m(o|a)i&#039;&lt;br /&gt;
 moi&lt;br /&gt;
&lt;br /&gt;
===== Laajennetut säännölliset lausekkeet: egrep =====&lt;br /&gt;
Esimerkissä käytettiin komentoa &amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;. Se on oikopolku grepin [[valitsin|valitsimelle]] &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;, joka ottaa säännöllisten lausekkeiden laajennetun (engl. extended) tuen käyttöön. Normaalissa käytössä (pelkkä komento &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) operaattorit &amp;lt;tt&amp;gt;? + {} | (&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; eivät ole käytettävissä, paitsi asettamalla niiden eteen pako-operaattorin &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== Prosessoitu tuloste: awk =====&lt;br /&gt;
Jos ylläolevassa prosessilistausesimerkissä halutaan tulostaa pelkät prosessien [[PID]]-numerot, voidaan käyttää [[awk]]-työkalua seuraavasti:&lt;br /&gt;
 $ ps -ef | awk &#039;/^qmail/ { print $2 }&#039;&lt;br /&gt;
 3986&lt;br /&gt;
 3990&lt;br /&gt;
 3994&lt;br /&gt;
 3995&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä lausekkeista ==&lt;br /&gt;
Web-kuva:&lt;br /&gt;
 [^ ]+\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)&lt;br /&gt;
Päivämäärä muotoa pp.kk.vvvv:&lt;br /&gt;
 [0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}&lt;br /&gt;
2-merkkinen [[wikipedia:fi:heksadesimaalijärjestelmä|heksadesimaali]]:&lt;br /&gt;
 [0-9A-Fa-f]{2}&lt;br /&gt;
Sähköpostiosoite:&lt;br /&gt;
 [a-zA-Z0-9_]+@[a-zA-Z0-9_\.]+\.[a-zA-Z]{2,3}&lt;br /&gt;
&lt;br /&gt;
== Laajennukset ==&lt;br /&gt;
Lukuunottamatta operaattoria &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ja POSIX-luokkia (&amp;lt;tt&amp;gt;[[:luokka:]]&amp;lt;/tt&amp;gt; jne.) yllä esitetty on pitkälti universaalisti tuettua säännöllisten lausekkeiden eri toteutuksissa. Monissa toteutuksissa on kuitenkin tehty laajennuksia tähän, mutta esim. [[grep]] ei tue seuraavia. &lt;br /&gt;
&lt;br /&gt;
=== Pakoluokat ===&lt;br /&gt;
Jos halutaan kirjoittaa lauseke, joka jossain kohtaa vastaa mitä tahansa numeromerkkiä, voidaan kirjoittaa hakasulkuilmaus &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;. Tälläisille yleisesti käytetyille luokille on kuitenkin olemassa laajennuksissa helpompia nimiä. Kutsutaan näitä &#039;&#039;pakoluokiksi&#039;&#039;. Ne muistuttavat läheisesti [[#POSIX-merkkiluokat|POSIX-merkkiluokkia]], mutta ovat lyhyempiä.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style: solid; border-collapse: collapse&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+&#039;&#039;&#039;Pakoluokat&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Ilmaisu !! Merkitys !! Vastaava hakasulkuilmaus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; || Mikä tahansa aakkonen a-z, numero tai alaviiva &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt;. || &amp;lt;tt&amp;gt;[a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\W&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa muu kuin aakkonen a-z, numero tai alaviiva. || &amp;lt;tt&amp;gt;[^a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; || Mikä tahansa tyhjä merkki (esim. välilyönti tai tabulaattori) || esim. &amp;lt;tt&amp;gt;[ \t]&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; tabulaattorimerkki&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-tyhjä merkki || esim. &amp;lt;tt&amp;gt;[^ \t]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; || Mikä tahansa numero. || &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\D&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-numero. || &amp;lt;tt&amp;gt;[^0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 \d+&lt;br /&gt;
vastaa siis kaikkia numeroita aivan siinä missä myös&lt;br /&gt;
 [0-9]+&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Grep]] ja [[Awk]]&lt;br /&gt;
** [[Putki]]&lt;br /&gt;
* [[Ed]] ja [[Sed]]: tuki säännöllisille lausekkeille&lt;br /&gt;
* [[Vi]] ja [[vim]]: näiden graaffinen tila&lt;br /&gt;
* [[Emacs]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[[wikipedia:fi:säännöllinen lauseke|Säännöllinen lauseke]]&lt;br /&gt;
*[[wikipedia:fi:äärellinen automaatti|Äärellinen automaatti]]&lt;br /&gt;
*[[wikipedia:fi:pinoautomaatti|Pinoautomaatti]]&lt;br /&gt;
*[[wikipedia:fi:turingin kone|Turingin kone]]&lt;br /&gt;
*[http://www.ohjelmointiputka.net/opas.php?tunnus=phpsl Säännölliset lausekkeet PHP:ssä] -opas Ohjelmointiputkassa&lt;br /&gt;
*[http://swtch.com/~rsc/regexp/regexp1.html Regular Expression Matching Can Be Simple And Fast]: Keskustelua säännöllisten lausekkeiden toteutuksesta C-kielellä englanniksi.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=EOF&amp;diff=30770</id>
		<title>EOF</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=EOF&amp;diff=30770"/>
		<updated>2010-02-17T16:22:57Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: /* ASCII-loppumerkki 0x04 */ kh&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;EOF&#039;&#039;&#039; eli &#039;&#039;&#039;loppumerkki&#039;&#039;&#039; on C-ohjelmoinnissa ja yleisesti Unix-järjestelmissä tiedoston lopusta kertova erikoismerkki. Kun ohjelma lukee tiedostosta loppumerkin EOF, se tarkoittaa yleensä, että tiedoston loppu on saavutettu, eikä lisää tietoa ole enää saatavilla.&lt;br /&gt;
&lt;br /&gt;
== C-ohjelmoinnissa ==&lt;br /&gt;
C-ohjelman kannalta tiedostot näkyvät [[tiedostokuvain|tiedostokuvaimina]] (engl. &#039;&#039;file descriptor&#039;&#039;). Tiedostokuvaimesta, joka yleensä on liitetty tiedostoon, mutta voi olla liitetty myös johonkin [[standardivirta]]an tai [[putki|putkeen]], voi lukea tavuja standardikirjaston kutsulla &#039;&#039;fgetc()&#039;&#039;. Kutsu palauttaa normaalisti tiedoston seuraavan 8-bittisen merkin, mutta mikäli tiedosto on lopussa tai lukemisessa tapahtuu virhe, kutsu palauttaa erikoisarvon EOF. EOF ei ole positiivinen 8-bittinen kokonaisluku (s.o. luku väliltä 0-255), vaan negatiivinen &#039;&#039;int&#039;&#039; -arvo. Näin mikään tiedosto ei voi sisältää merkkiä EOF, eikä sitä voi tallettaa tyyppiin &#039;&#039;unsigned char&#039;&#039;. Siksi paluuarvo EOF on aina erikoistapaus.&lt;br /&gt;
&lt;br /&gt;
C-ohjelman tulee aina erikseen varmistaa, merkitseekö EOF -paluuarvo todella tiedoston loppua vaiko virhetilannetta kutsulla &#039;&#039;feof()&#039;&#039; tai &#039;&#039;ferror()&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ASCII-loppumerkki 0x04 ==&lt;br /&gt;
Loppumerkkiä läheisesti muistuttaa ASCII-merkki 0x04 (End of Transmission). Vanhoissa järjestelmissä kuten [[wikipedia:fi:CP/M|CP/M]] järjestelmä talletti jokaisen tiedoston osalta vain sille varattujen talletuslohkojen määrän. Mikäli tiedostoon tallennettu data loppui talletuslohkojen välissä, tiedoston lopusta kertoi erikoismerkki 0x04. Tälläinen tiedosto ei voi tietenkään sisältää muuaalla kontrollimerkkiä 0x04, joka aiheuttaisi vakavia ongelmia nykyisissä järjestelmissä, joiden levyille saatetaan tallettaa mm. salattua tai pakattua binääritietoa. Siksi termillä EOF viitataan nykyisin Linux- ja Unix järjestelmissä useimmiten negatiiviseen lukufunktion paluuarvoon EOF, joka ei voi vastata arvoltaan mitään aitoa merkkiä, esimerkiksi ASCII-kontrollimerkkiä.&lt;br /&gt;
&lt;br /&gt;
== Terminaalissa ==&lt;br /&gt;
Syötteen voi terminaalissa lopettaa antamalla erikoismerkin &amp;lt;tt&amp;gt;^D&amp;lt;/tt&amp;gt;, joka PC-järjestelmissä tapahtuu painamalla Ctrl ja D kirjaimia samaan aikaan. Tämä johtaa terminaaliajurin vaikutuksesta siihen, että terminaalia lukeva prosessi saa järjestelmältä paluuarvon EOF, ja ymmärtää syötettävän tiedon loppuneen.&lt;br /&gt;
&lt;br /&gt;
Esimerkiksi komento &lt;br /&gt;
 cat &amp;gt; teksti.txt&lt;br /&gt;
lukee terminaalista käyttäjän syötettä, kunnes annetaan erikoismerkki &amp;lt;tt&amp;gt;^D&amp;lt;/tt&amp;gt;. Tämän jälkeen [[cat]] ymmärtää tiedoston loppuneen, ja käyttäjän syöttämä teksti kirjoitetaan tiedostoon teksti.txt.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30769</id>
		<title>Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30769"/>
		<updated>2010-02-17T16:19:56Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: kh.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Säännöllinen lauseke&#039;&#039;&#039; (engl. &#039;&#039;&#039;regular expression&#039;&#039;&#039;, &#039;&#039;&#039;regexp&#039;&#039;&#039;) on yksinkertainen merkkijonokieli, joka voi joko &#039;&#039;vastata&#039;&#039; tai &#039;&#039;olla vastaamatta&#039;&#039; jotain toista merkkijonoa.  Linux- ja Unix-järjestelmissä säännöllisiä lauskkeista on suurta hyötyä [[komentorivi]]ä käytettäessä esimerkiksi merkkijonojen etsimis- ja korvaustoiminnoissa. Niiden voidaankin sanoa olevan [[putki]]ttamiseen yhdistettynä tärkeimpiä työkaluja, joita komentorivin edistynyt käyttö edellyttää.&lt;br /&gt;
&lt;br /&gt;
Tässä artikkelissa on esitetty johdatus säännöllisiin lausekkeisiin siten, miten komentorivityöklu &amp;lt;tt&amp;gt;[[grep]]&amp;lt;/tt&amp;gt; ne ymmärtää &#039;&#039;laajennettussa&#039;&#039; (engl. extended) tilassa. Kaikissa säännöllisten lausekkeiden toteutuksissa syntaksi ei kuitenkaan ole aivan sama. Perusoperaattorit (&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;, sulut) ovat kuitenkin &#039;&#039;universaaleja&#039;&#039;, eli kaikki toteutukset tukevat niitä.&lt;br /&gt;
&lt;br /&gt;
Säännöllisistä lausekkeista on yleisesti käytössä kolme tyyppiä: &#039;&#039;tavallinen&#039;&#039; (engl. basic), &#039;&#039;laajennettu &#039;&#039;(engl. extended) ja &#039;&#039;[[Perl]]-tyyppinen&#039;&#039;. Varsinkin useassa järjestelmässä käytettäviä [[skripti|skriptejä]] kirjoitettaessa täytyy olla huolellinen, mikäli käyttää tavallisesta poikkeavia ilmaisuja. Tässä ohjeessa esitetty syntaksi on yhteensopiva Linuxin [[GNU]]-grepin laajennetun syntaksin kanssa jollei toisin mainita.&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita ei pidä sekoittaa tiedostonimi-jokereihin ([[glob]]), joilla on samankaltainen toiminnallisuus (vrt. &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;.*&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Teoriaa ==&lt;br /&gt;
Tietojenkäsittelytieteessä puhutaan [[wikipedia:fi:säännöllinen kieli|säännöllisestä kielestä]], joka voidaan tunnistaa [[wikipedia:fi:äärellinen automaatti|äärellisellä automaatilla]]. Säännöllisten lauskkeiden historia juontaa juurensa siten 50- ja 60-luvuille [[wikipedia:fi:tietojenkäsittelytiede|tietojenkäsittelytieteen]] syntyaikohiin. [[Unix]]-järjestelmissä säännöllisiä lausekkeita on voinut hyödyntää aina ensimmäisistä versioista lähtien. Ensimmäinen grep-ohjelma kirjoitettiin ilmeisesti vuonna 1973.&amp;lt;sup&amp;gt;[http://www.columbia.edu/~rh120/ch001j.c11]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita voi hyödyntää monissa ohjelmointikielissä (mm. Perl, Java, Python, ECMAScript). Mille tahansa [[wikipedia:en:Turing complete|Turing-täydelliselle]] ohjelmointikielelle voidaan myös aina kirjoittaa säännöllisten lausekkeiden [[wikipedia:fi:Ohjelmointikielen tulkki|tulkki]].&lt;br /&gt;
&lt;br /&gt;
== Johdatus säännöllisiin lausekkeisiin ==&lt;br /&gt;
&lt;br /&gt;
===Perusteet===&lt;br /&gt;
Säännöllinen lauseke joko &#039;&#039;vastaa&#039;&#039; tai &#039;&#039;ei vastaa&#039;&#039; merkkijonoa. Kutsutaan säännöllistä lauseketta &#039;&#039;lausekkeeksi&#039;&#039; ja merkkijonoa, jonka vastaavuus lausekkeeseen halutaan selvittää, &#039;&#039;kohteeksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lausekkeen yksinkertaiset kirjoitusmerkit vastaavat yksi-yhteen kohteen kirjoitusmerkkejä. Tämän vuoksi lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa yllätyksettömästi kohdetta&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei kohdetta&lt;br /&gt;
 bono&lt;br /&gt;
&lt;br /&gt;
Yleensä (mm. grep ja awk) katsotaan, että kohteen alussa ja lopussa voi olla mielivaltainen määrä ei-vastaavia merkkejä. Tällöin kohde (s.o. näiden komentojen tapauksessa &#039;&#039;rivi&#039;&#039;) vastaa lauseketta, jos edes jokin sen &#039;&#039;osa&#039;&#039; vastaa lauseketta. Siis grep ja awk -yhteydessä lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa kohdetta&lt;br /&gt;
 bo&#039;&#039;&#039;abba&#039;&#039;&#039;bo&lt;br /&gt;
ja&lt;br /&gt;
 dada&#039;&#039;&#039;abba&#039;&#039;&#039;gada&lt;br /&gt;
mutta ei silti kohdetta&lt;br /&gt;
 b&#039;&#039;&#039;abb&#039;&#039;&#039;bab&lt;br /&gt;
&lt;br /&gt;
===Operaattorit===&lt;br /&gt;
Yksi-yhteen vastaavien kirjoitusmerkkien lisäksi säännöllisissä lausekkeissa on mahdollisuus käyttää erilaisia &#039;&#039;operaattorimerkkejä&#039;&#039;, joilla on lausekkeessa erikoismerkitys.&lt;br /&gt;
&lt;br /&gt;
====Vaihtoehtoisuusoperaattori: &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Näistä ensimmäinen on operaattori &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;, joka tarkoittaa &#039;&#039;vaihtelua&#039;&#039; tai &#039;&#039;alternointia&#039;&#039; (engl. alternation). Sen merkitys on sama kuin luonnollisen kielen sanalla &amp;quot;tai&amp;quot;. Lauseke&lt;br /&gt;
 omena|luumu&lt;br /&gt;
vastaa sekä kohteita&lt;br /&gt;
 &#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
että&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;&lt;br /&gt;
Kun lisäksi muistamme yltä, että komentorivityökalujen tapauksessa kohde voi sisältää ei-vastaavia merkkejä sekä alussa että lopussa, vastaa ylläoleva lauseke &amp;lt;tt&amp;gt;omena|luumu&amp;lt;/tt&amp;gt; myös merkkijonoja&lt;br /&gt;
 uuni&#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
tai&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;soppa&lt;br /&gt;
Huomaa kuitenkin, että seuraavassa kohteessa vain ensimmäinen esiintymä vastaa lauseketta&lt;br /&gt;
 kotimainen &#039;&#039;&#039;omena&#039;&#039;&#039;-luumuhillo&lt;br /&gt;
&lt;br /&gt;
====Toisto-operaattorit====&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja ilmaisulla &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; on säännöllisissä lausekkeissa erikoismerkitys, joka vaikuttaa niitä &#039;&#039;välittömästi edeltävään&#039;&#039; merkkiin.&lt;br /&gt;
&lt;br /&gt;
=====Mielivaltaisen monta: &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, tai ei kertaakaan&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab*a&lt;br /&gt;
vastaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Todettakooon, että selvästi b-merkkien määrä kohteessa voi olla mielivaltainen, joten eri vastaavia kohdemerkkijonoja on olemassa myös ääretön määrä.&lt;br /&gt;
&lt;br /&gt;
=====Vähintään yksi: &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, mutta vähintään kerran&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab+a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====Ehdollinen: &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen kerran, tai ei kertaakaan&#039;&#039;&amp;quot;. Siten lauseke&lt;br /&gt;
 ab?a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bbbbbbbbbbbbbbbba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;ba&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====n:stä m:n kertaan: &amp;lt;tt&amp;gt;{n, m}&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Aina yllä olevat operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; eivät riitä, vaan jotain merkkiä tarvitsee vastata juuri tietyn määrän toistoja. Voitaisiin toki kirjoittaa&lt;br /&gt;
 aaaa?a?&lt;br /&gt;
jos halutaan vastata&lt;br /&gt;
 aaa&lt;br /&gt;
 aaaa&lt;br /&gt;
 aaaaa&lt;br /&gt;
mutta voidaan kirjoittaa lyhyemmin&lt;br /&gt;
 a{3,5}&lt;br /&gt;
Tämä tarkoittaa, että edeltävää merkkiä &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; voi esiintyä kolmesta viiteen kertaan. Käytetään yleisesti tästä ilmaisusta mallia &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; ovat mielivaltaisia kokonaislukuja, tarkoittaen &#039;&#039;&amp;quot;n:stä m:n kertaan&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Kumpi tahansa numeroista &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; voidaan jättää pois. Täten ilmaisu&lt;br /&gt;
 {n}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;tasan n kertaa&amp;quot;&#039;. Ilmaisu&lt;br /&gt;
 {n,}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;vähintään n kertaa&amp;quot;&#039;&#039;. Ilmaisu&lt;br /&gt;
 {,m}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;korkeintaan m kertaa&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sivuhuomatuksena todettakoon, että yllä olevan perusteella lyhyemmät operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; voitaisiin aina korvata ilmaisuilla &amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{1,}&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt; vastaavasti. {m,n}-muoto on kuitenkin uudempi laajennos, joka ei toimi kaikissa ohjelmassa.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Operaattori &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ei ole tuettu kaikissa säännöllisten lausekkeiden toteutuksissa. GNU grep tukee niitä laajennetussa tilassa (&amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===== Huomautuksia =====&lt;br /&gt;
Operaattoreita voi yhdistää mielivaltaisesti toisiinsa. Siten lauseke&lt;br /&gt;
 hur+a*!*&lt;br /&gt;
vastaavaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;hur&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurra&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa!&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurrraaa!!!!&#039;&#039;&#039;&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Toisaalta lauseke &#039;&#039;ei vastaa&#039;&#039; mitään seuraavista kohteista:&lt;br /&gt;
 burraa!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;aa!!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;uuurraa!!&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;urrur!!&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Tässä vaiheessa on hyvä varmistaa, että ymmärtää edellä esitetyn esimerkin kokonaisuudessaan.&lt;br /&gt;
&lt;br /&gt;
===Sulut: &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Kysymys:&#039;&#039;&#039; Jos halutaan vastata kohdetta &amp;lt;tt&amp;gt;hUrrUrrUrr&amp;lt;/tt&amp;gt; siten, että merkkijono &amp;lt;tt&amp;gt;Urr&amp;lt;/tt&amp;gt; voi esiintyä kohteessa äärettömän monta kertaa, miten tulee toimia?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vastaus:&#039;&#039;&#039; Tämä on mahdotonta tähän mennessä esitetyillä operaattoreilla. Voisimme toki kirjoittaa &amp;lt;tt&amp;gt;hU+r+r+&amp;lt;/tt&amp;gt; tai vastaavaa, mutta tämä vastaisi vain kohteita kuten &amp;lt;tt&amp;gt;hUUrrrr&amp;lt;/tt&amp;gt;. Tarvitsemme selvästi uuden operaattorin; &#039;&#039;sulut&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; voidaan määrittää lausekkeen osia, jotka samaan tapaan kuin koulumatematiikassa lasketaan &#039;&#039;ennen&#039;&#039; laskun muita osia. Koska säännöllisissä lausekkeissa ei kuitenkaan lasketa mitään, havainnollistetaan sulkujen merkitystä esittämällä ratkaisu yllä olevaan kysymykseen. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 h(Urr)+&lt;br /&gt;
vastaa kohteita&lt;br /&gt;
 &#039;&#039;&#039;hUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
jne. jne. Lauseke ei vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Arr&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Err&lt;br /&gt;
 burr&lt;br /&gt;
&lt;br /&gt;
Samoin kohde &lt;br /&gt;
 &#039;&#039;&#039;hUr&#039;&#039;&#039;&lt;br /&gt;
näyttää oikealta, mutta jää kuitenkin liian lyhyeksi, sillä sulkujen sisältö on löydyttävä kohteesta aina &#039;&#039;kokonaan&#039;&#039;. Siksi kohde &amp;lt;tt&amp;gt;hUr&amp;lt;/tt&amp;gt; &amp;lt;u&amp;gt;ei&amp;lt;/u&amp;gt; vastaa lauseketta &amp;lt;tt&amp;gt;h(Urr)+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Esimerkkejä====&lt;br /&gt;
&lt;br /&gt;
Sulkuja voi yhdistellä mielivaltaisesti kaikkiin operaattoreihin &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;. Seuraavassa on annettu sarja lausekkeita, sekä esimerkkejä kutakin vastaavista ja vastaamattomista kohteista:&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 d(ii)?pada+(pa|ba)?&lt;br /&gt;
vastaa esimerkiksi seuraavia kohteita&lt;br /&gt;
 &#039;&#039;&#039;diipadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista&lt;br /&gt;
 &#039;&#039;&#039;di&#039;&#039;&#039;padaapa&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;uu&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Viimeinen esimerkki jää lyhyeksi, sillä merkki &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; on lausekkeessa pakollinen vähintään kerran.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (hi|ha|ho)+&lt;br /&gt;
vastaa mitä tahansa kohdetta, jossa esiintyy mikä tahansa määrä merkkijonoja &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ha&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;ho&amp;lt;/tt&amp;gt; peräkkäin mielivaltaisen monta kertaa, kuitenkin vähintään kerran. Lauseke vastaa siis kaikkia seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;haha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hiha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hoho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihaho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hahohihohahi&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;e&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;u&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;uhu&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;ehe&lt;br /&gt;
&lt;br /&gt;
===Yhtä merkkiä vastaavat erikoismerkit===&lt;br /&gt;
Säännöllisissä lausekkeissa voi esiintyä myös joitain erikoismerkkejä, jotka eivät ole operaattoreita, eli ne eivät vaikuta niitä edeltäviin sulkuihin tai merkkeihin. Ne voitaisiin aina kirjoittaa lausekkeilla muotoa&lt;br /&gt;
 (merkki1|merkki2|merkki3|merkki4|...|merkkiN)&lt;br /&gt;
mutta tämä on varsin työlästä ja epäselkeää. Siksi säännöllisissä lausekkeissa on joitain erikoismerkkejä, jotka ovat oikopolkuja monimutkaisten vaihtoehtoisuuslausekkeiden kirjoittamiseen.&lt;br /&gt;
&lt;br /&gt;
====Jokerimerkki: &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Merkillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; (piste) on erikoismerkitys. Se vastaa aina &#039;&#039;mitä tahansa&#039;&#039; merkkiä. Lauseke&lt;br /&gt;
 .*&lt;br /&gt;
vastaa siis kaikkia mahdollisia kohteita - jopa tyhjää merkkijonoa, sillä operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa, että erikoisoperaattori &amp;quot;mikä tahansa merkki&amp;quot; voi esiintyä myös nolla kertaa. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (h.)+&lt;br /&gt;
vastaa siten kaikkia seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;he&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hy&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihrhy&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 rh&lt;br /&gt;
 ah&lt;br /&gt;
 oh&lt;br /&gt;
 ih&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;&lt;br /&gt;
Viimeinen esimerkki jää jälleen lyhyeksi, sillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; ei vastaa kuitenkaan &amp;quot;tyhjää&amp;quot; merkkiä.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 .upu&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
mutta myös&lt;br /&gt;
 &#039;&#039;&#039;supu&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 sepe&lt;br /&gt;
&lt;br /&gt;
====Merkkiluokat: &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan korjata ylläoleva Ankanpoika-esimerkki, voitaisiin kirjoittaa:&lt;br /&gt;
 (t|h|l|T|H|L)upu&lt;br /&gt;
joka vastaisi vain ja ainoastaan:&lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Merkkien &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; avulla voidaan määritellä kirjainluokkia siten, että seuraava merkki kohteessa vastaa vain ja ainoastaan jotain hakasulkujen välissä olevaa kirjainta. Siten äskeistä täysin vastaa lauseke on&lt;br /&gt;
 [thlTHL]upu&lt;br /&gt;
&lt;br /&gt;
Hakasulkujen välissä voidaan myös määritellä [[lokaali]]n aakkoston mukaisia välejä väliviivalla &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;. Tällöin &lt;br /&gt;
 19[4-9][0-9]|20[0-9][0-9]&lt;br /&gt;
vastaa kaikkia vuosilukuja välillä 1940-2099. Samoin &lt;br /&gt;
 Osasto [A-I]&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;Osasto A&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto B&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto C&#039;&#039;&#039;&lt;br /&gt;
 ...&lt;br /&gt;
 &#039;&#039;&#039;Osasto H&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto I&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;Osasto &#039;&#039;&#039;J&lt;br /&gt;
&lt;br /&gt;
On huomioitavaa, että myös kohteet ”Osasto b” tai ”Osasto È” saattavat vastata yllä esitettyä lausketta joissain [[lokaali|lokaaleissa]].&lt;br /&gt;
&lt;br /&gt;
Jos merkki &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; halutaan sisällyttää hakasulkuilmaisuun, se jätetään viimeiseksi. Esim.&lt;br /&gt;
 Ala[ -]aste&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;Ala aste&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Ala-aste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jos oikea hakasulku (&amp;lt;tt&amp;gt;]&amp;lt;/tt&amp;gt;) halutaan sisällyttää hakasulkuilmaukseen, se laitetaan hakasulkujen ensimmäiseksi merkiksi. Esim.&lt;br /&gt;
 []abcdef]+&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;b&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ab]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;d]f&#039;&#039;&#039;&lt;br /&gt;
jne., mutta ei&lt;br /&gt;
 [gi&lt;br /&gt;
 zo&lt;br /&gt;
&lt;br /&gt;
Hakasulkuilmaisusn merkitys voidaan kääntää asettamalla hattu &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; sen ensimmäiseksi merkiksi. Tällöin hakasulkuilmaisu vastaa mitä tahansa hakasuluissa &amp;lt;u&amp;gt;&#039;&#039;&#039;ei&#039;&#039;&#039;&amp;lt;/u&amp;gt; esiintyvää merkkiä kohteessa. Täten lauseke&lt;br /&gt;
 [^aeiouyåäö]+&lt;br /&gt;
vastaa mitä tahansa pelkistä konsonanteista, välimerkeistä ja numeroista koostuvaa kohdetta, kuten&lt;br /&gt;
 &#039;&#039;&#039;prrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;123&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hkr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;brr-hrr&#039;&#039;&#039;&lt;br /&gt;
jne. Mutta ei&lt;br /&gt;
 au&lt;br /&gt;
 aiai&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Grepin hyväksymissä säännöllisissä lausekkeissa merkin &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; voi sisällyttää hakasulkuilmaukseen laittamalla sen miksi tahansa muuksi merkiksi, kuin hakasulkujen ensimmäinen merkki. Tämä ei pidä välttämättä paikkaansa kuitenkaan kaikilla säännöllisten lausekkeiden toteutuksilla, vaan hattumerkin eteen on mahdollisesti laitettava pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=====POSIX-merkkiluokat=====&lt;br /&gt;
Joitain erikoismerkkiluokkia on määrätty ennakkoon grepissä. Esimerkiksi&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:digit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alpha:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alnum:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta tai numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:space:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa tyhjää (esim. välilyönti, tabulaattori) merkkiä&lt;br /&gt;
&lt;br /&gt;
Muita tällaisia ovat &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:lower:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:upper:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:xdigit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:blank:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:punct:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:print:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:cntrl:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:graph:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Merkkiluokat tulee laittaa lisäksi ulompien hakasulkujen &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; sisään. Esimerkiksi &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[[:upper:]]&amp;lt;/nowiki&amp;gt;+&lt;br /&gt;
joka vastaa yleensä ilmaisua&lt;br /&gt;
 [A-Z]+&lt;br /&gt;
eli mielivaltainen (vähintään yksi) määrä isoja kirjaimia A-Z.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Merkkiluokkia käytettäessä on huomioitava, että käytetty lokaali vaikuttaa ratkaisevasti siihen, mitä merkkejä luokkaan sisältyy. Siksi niitä ei voi käyttää tietoturvatarkistuksiin muuta kuin ennalta tiedetyillä lokaaleilla.&lt;br /&gt;
&lt;br /&gt;
====Pako-operaattori: &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan vastata jotain merkkiä, joka on määritelty operaattoriksi säännöllisissä lausekkeissa, sitä ei voida kirjoittaa sellaisenaan lausekkeeseen. Jos halutaan vastata tarkalleen jotain seuraavista&lt;br /&gt;
 Mitä?&lt;br /&gt;
 Missä?&lt;br /&gt;
 Milloin?&lt;br /&gt;
ei voida kirjoittaa lauseketta&lt;br /&gt;
 (Mi(tä|ssä|lloin))?&lt;br /&gt;
koska kysymysmerkki &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; lopussa vain ehdollista koko ulomman sulkuilmaisun, ja koko lauseke vastaisi siis vain joko tyhjää merkkijonoa tai kysymysmerkitöntä kysymyssanaa.&lt;br /&gt;
&lt;br /&gt;
Tarvitaan pako-operaattoria &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Merkin &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tai ylipäänsä minkä tahansa opraattorimerkin erikoismerkityksen voi poistaa asettamalla sen eteen kenoviivan. Tällöin kenoviivaa välittömästi seuraava merkki täytyy esiintyä kohteessa sellaisenaan. Oikea tapa kirjoittaa yllä oleva lauseke olisi siten&lt;br /&gt;
 (Mi(tä|ssä|lloin))\?&lt;br /&gt;
Tämä vastaa vain ja ainoastaan haluttuja merkkijonoja.&lt;br /&gt;
&lt;br /&gt;
Seuraavat operaattorit on merkittävä pako-operaattorilla, jos niitä ei haluta tulkittavan erikoismerkeiksi:&lt;br /&gt;
 ( ) | * + ? { } [ ] ^ $ \&lt;br /&gt;
&lt;br /&gt;
Siis, jos halutaan vastata kohteessa kenoviivaa, on kirjoitettava &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;. Esimerkiksi Windows-polku:&lt;br /&gt;
 &#039;&#039;&amp;lt;asema&amp;gt;&#039;&#039;:\Dokumentit\&#039;&#039;&amp;lt;nimi&amp;gt;&#039;&#039;.(doc, docx tai odt)&lt;br /&gt;
voidaan löytää esim. seuraavalla säännöllisellä lausekkeella:&lt;br /&gt;
 [A-Z]:\\Dokumentit\\[a-öA-Ö0-9 _-]+\.(doc|docx|odt)&lt;br /&gt;
&lt;br /&gt;
=== Rivin alku ja loppu: &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;===&lt;br /&gt;
On voinut herätä kysymys, kuinka voidaan vastata kohdetta (s.o. riviä) &#039;&#039;tarkalleen&#039;&#039;. Heti alussa selvisi, että esim grepin mielestä kohde (rivi) vastaa lauseketta, jos lauseke esiintyy missä tahansa kohdassa riviä. Jos halutaan, että lauseke vastaa alusta loppuun tarkalleen koko riviä, on otettava käyttöön erikoismerkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;. Nämä vastaavat kohteessa rivin tai merkkijonon alkua ja loppua kuvaavia &amp;quot;näkymättömiä&amp;quot; merkkejä vastaavasti. Siten&lt;br /&gt;
 ^abba$&lt;br /&gt;
vastaa vain riviä&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei esimerkiksi&lt;br /&gt;
 babba&lt;br /&gt;
 abbab&lt;br /&gt;
 babbab&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;abb&#039;&#039;&#039;bba&lt;br /&gt;
 ^abba&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;$&lt;br /&gt;
 ^abba$&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki ====&lt;br /&gt;
&lt;br /&gt;
Merkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; antavat viimeisen silauksen grepin tehokkaaseen hyödyntämiseen. Nyt esimerkiksi, jos tulostetaan kaikki [[prosessi]]t komennolla &amp;lt;tt&amp;gt;[[ps]] -ef&amp;lt;/tt&amp;gt;, saadaan yleensä jokseenkin tälläinen listaus (esimerkissä palvelinkone):&lt;br /&gt;
 &lt;br /&gt;
 $ ps -ef&lt;br /&gt;
 UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
 root         1     0  0 Jan21 ?        00:00:34 init [2]      &lt;br /&gt;
 root      1425     1  0 Jan31 ?        00:00:00 /usr/sbin/xinetd&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
 root      5566     1  0 Jan21 ?        00:00:05 /usr/sbin/apache2 -k start&lt;br /&gt;
 root      6091     1  0 Jan21 ?        00:00:03 /usr/sbin/cron&lt;br /&gt;
 www-data 15379  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 www-data 15386  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 root     21684 32395  0 20:37 ?        00:00:00 sshd: user [priv]&lt;br /&gt;
 user     21688 21684  0 20:37 ?        00:00:00 sshd: user@pts/1&lt;br /&gt;
 user     21689 21688  0 20:37 pts/1    00:00:00 -bash&lt;br /&gt;
 user     21705 21689  0 20:37 pts/1    00:00:00 ps -ef&lt;br /&gt;
 syslog   32279     1  0 Jan21 ?        00:00:07 /sbin/syslogd -u syslog&lt;br /&gt;
 bind     32351     1  0 Jan31 ?        00:00:00 /usr/sbin/named&lt;br /&gt;
 root     32395     1  0 Jan21 ?        00:00:22 /usr/sbin/sshd&lt;br /&gt;
 (... jne ...)&lt;br /&gt;
&lt;br /&gt;
Jos haluamme ylläolevasta listasta vain &amp;quot;qmail&amp;quot; -alkuisten [[käyttäjä|käyttäjien]] prosessit, voisimme kirjoittaa&lt;br /&gt;
 ps -ef | grep qmail&lt;br /&gt;
Tämä kuitenkin tulostaa myös kaikki sellaiset prosessit, joiden nimikentässä esiintyy &amp;quot;qmail&amp;quot; – joukossa myös käyttäjän [[root]] prosesseja vastoin alkuperäistä tarkoitusta:&lt;br /&gt;
 $ ps -ef | grep qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger &#039;&#039;&#039;qmail&#039;&#039;&#039; 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-clean&lt;br /&gt;
&lt;br /&gt;
Ratkaisu qmail -alkuisten käyttäjien prosessien listaamiseen on:&lt;br /&gt;
 $ ps -ef | grep ^qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Hattumerkki &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; alussa vastaa jokaisen listausrivin alkua, jota pitää välittömästi seurata merkkijono &amp;lt;tt&amp;gt;qmail&amp;lt;/tt&amp;gt;, ja tämän jälkeen voi tulla mikä tahansa merkkejä, koska loppumerkkiä ei ole tarkoituksella annettu. Grep tulostaa vain lausketta vastaavat rivit, ja tulos on haluttu.&lt;br /&gt;
&lt;br /&gt;
===== Pako komentotulkista =====&lt;br /&gt;
Jos halutaan antaa jokin monimutkaisempi ilmaisu, on hyvä asettaa säännöllinen lauseke yksinkertaisten heittomerkkien &amp;lt;tt&amp;gt;&#039;&amp;lt;/tt&amp;gt; sisään, jotta ne regexp-operaattorit, joillla on jokin erikoismerkitys [[komentotulkki|komeotulkissa]] eivät aiheuta ongelmia.&lt;br /&gt;
 $ echo moi | egrep m(o|a)i&lt;br /&gt;
 -bash: syntax error near unexpected token `(&#039;&lt;br /&gt;
Sululla &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; on erikoismerkitys komentotulkissa, samoin merkillä &amp;lt;tt&amp;gt;[[putki||]]&amp;lt;/tt&amp;gt;. Ratkaisu:&lt;br /&gt;
 $ echo moi | egrep &#039;m(o|a)i&#039;&lt;br /&gt;
 moi&lt;br /&gt;
&lt;br /&gt;
===== Laajennetut säännölliset lausekkeet: egrep =====&lt;br /&gt;
Esimerkissä käytettiin komentoa &amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;. Se on oikopolku grepin [[valitsin|valitsimelle]] &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;, joka ottaa säännöllisten lausekkeiden laajennetun (engl. extended) tuen käyttöön. Normaalissa käytössä (pelkkä komento &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) operaattorit &amp;lt;tt&amp;gt;? + {} | (&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; eivät ole käytettävissä, paitsi asettamalla niiden eteen pako-operaattorin &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== Prosessoitu tuloste: awk =====&lt;br /&gt;
Jos ylläolevassa prosessilistausesimerkissä halutaan tulostaa pelkät prosessien [[PID]]-numerot, voidaan käyttää [[awk]]-työkalua seuraavasti:&lt;br /&gt;
 $ ps -ef | awk &#039;/^qmail/ { print $2 }&#039;&lt;br /&gt;
 3986&lt;br /&gt;
 3990&lt;br /&gt;
 3994&lt;br /&gt;
 3995&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä lausekkeista ==&lt;br /&gt;
Web-kuva:&lt;br /&gt;
 [^ ]+\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)&lt;br /&gt;
Päivämäärä muotoa pp.kk.vvvv:&lt;br /&gt;
 [0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}&lt;br /&gt;
2-merkkinen [[wikipedia:fi:heksadesimaalijärjestelmä|heksadesimaali]]:&lt;br /&gt;
 [0-9A-Fa-f]{2}&lt;br /&gt;
Sähköpostiosoite:&lt;br /&gt;
 [a-zA-Z0-9_]+@[a-zA-Z0-9_\.]+\.[a-zA-Z]{2,3}&lt;br /&gt;
&lt;br /&gt;
== Laajennukset ==&lt;br /&gt;
Lukuunottamatta operaattoria &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ja POSIX-luokkia (&amp;lt;tt&amp;gt;[[:luokka:]]&amp;lt;/tt&amp;gt; jne.) yllä esitetty on pitkälti universaalisti tuettua säännöllisten lausekkeiden eri toteutuksissa. Monissa toteutuksissa on kuitenkin tehty laajennuksia tähän, mutta esim. [[grep]] ei tue seuraavia. &lt;br /&gt;
&lt;br /&gt;
=== Pakoluokat ===&lt;br /&gt;
Jos halutaan kirjoittaa lauseke, joka jossain kohtaa vastaa mitä tahansa numeromerkkiä, voidaan kirjoittaa hakasulkuilmaus &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;. Tälläisille yleisesti käytetyille luokille on kuitenkin olemassa laajennuksissa helpompia nimiä. Kutsutaan näitä &#039;&#039;pakoluokiksi&#039;&#039;. Ne muistuttavat läheisesti [[#POSIX-merkkiluokat|POSIX-merkkiluokkia]], mutta ovat lyhyempiä.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style: solid; border-collapse: collapse&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+&#039;&#039;&#039;Pakoluokat&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Ilmaisu !! Merkitys !! Vastaava hakasulkuilmaus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; || Mikä tahansa aakkonen a-z, numero tai alaviiva &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt;. || &amp;lt;tt&amp;gt;[a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\W&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa muu kuin aakkonen a-z, numero tai alaviiva. || &amp;lt;tt&amp;gt;[^a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; || Mikä tahansa tyhjä merkki (esim. välilyönti tai tabulaattori) || esim. &amp;lt;tt&amp;gt;[ \t]&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; tabulaattorimerkki&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-tyhjä merkki || esim. &amp;lt;tt&amp;gt;[^ \t]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; || Mikä tahansa numero. || &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\D&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-numero. || &amp;lt;tt&amp;gt;[^0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 \d+&lt;br /&gt;
vastaa siis kaikkia numeroita aivan siinä missä myös&lt;br /&gt;
 [0-9]+&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Grep]] ja [[Awk]]&lt;br /&gt;
** [[Putki]]&lt;br /&gt;
* [[Ed]] ja [[Sed]]: tuki säännöllisille lausekkeille&lt;br /&gt;
* [[Vi]] ja [[vim]]: näiden graaffinen tila&lt;br /&gt;
* [[Emacs]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[[wikipedia:fi:säännöllinen lauseke|Säännöllinen lauseke]]&lt;br /&gt;
*[[wikipedia:fi:äärellinen automaatti|Äärellinen automaatti]]&lt;br /&gt;
*[[wikipedia:fi:pinoautomaatti|Pinoautomaatti]]&lt;br /&gt;
*[[wikipedia:fi:turingin kone|Turingin kone]]&lt;br /&gt;
*[http://www.ohjelmointiputka.net/opas.php?tunnus=phpsl Säännölliset lausekkeet PHP:ssä] -opas Ohjelmointiputkassa&lt;br /&gt;
*[http://swtch.com/~rsc/regexp/regexp1.html Regular Expression Matching Can Be Simple And Fast]: Keskustelua säännöllisten lausekkeiden toteutuksesta C-kielellä englanniksi.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30768</id>
		<title>Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30768"/>
		<updated>2010-02-17T16:18:20Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: ehostus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Säännöllinen lauseke&#039;&#039;&#039; (engl. &#039;&#039;&#039;regular expression&#039;&#039;&#039;, &#039;&#039;&#039;regexp&#039;&#039;&#039;) on yksinkertainen merkkijonokieli, joka voi joko &#039;&#039;vastata&#039;&#039; tai &#039;&#039;olla vastaamatta&#039;&#039; jotain toista merkkijonoa.  Linux- ja Unix-järjestelmissä säännöllisiä lauskkeista on suurta hyötyä [[komentorivi]]ä käytettäessä esimerkiksi merkkijonojen etsimis- ja korvaustoiminnoissa. Niiden voidaankin sanoa olevan [[putki]]ttamiseen yhdistettynä tärkeimpiä työkaluja, joita komentorivin edistynyt käyttö edellyttää.&lt;br /&gt;
&lt;br /&gt;
Tässä artikkelissa on esitetty johdatus säännöllisiin lausekkeisiin siten, miten komentorivityöklu &amp;lt;tt&amp;gt;[[grep]]&amp;lt;/tt&amp;gt; ne ymmärtää &#039;&#039;laajennettussa&#039;&#039; (engl. extended) tilassa. Kaikissa säännöllisten lausekkeiden toteutuksissa syntaksi ei kuitenkaan ole aivan sama. Perusoperaattorit (&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;, sulut) ovat kuitenkin &#039;&#039;universaaleja&#039;&#039;, eli kaikki toteutukset tukevat niitä.&lt;br /&gt;
&lt;br /&gt;
Säännöllisistä lausekkeista on yleisesti käytössä kolme tyyppiä: &#039;&#039;tavallinen&#039;&#039; (engl. basic), laajennettu (engl. extended) ja &#039;&#039;[[Perl]]-tyyppinen&#039;&#039;. Varsinkin useassa järjestelmässä käytettäviä [[skripti|skriptejä]] kirjoitettaessa pitää olla huolellinen, mikäli käyttää tavallisesta poikkeavia ilmaisuja. Tässä ohjeessa esitetty syntaksi on yhteensopiva Linuxin [[GNU]]-grepin laajennetun syntaksin kanssa jollei toisin mainita.&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita ei pidä sekoittaa tiedostonimi-jokereihin ([[glob]]), joilla on samankaltainen toiminnallisuus (vrt. &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;.*&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Teoriaa ==&lt;br /&gt;
Tietojenkäsittelytieteessä puhutaan [[wikipedia:fi:säännöllinen kieli|säännöllisestä kielestä]], joka voidaan tunnistaa [[wikipedia:fi:äärellinen automaatti|äärellisellä automaatilla]]. Säännöllisten lauskkeiden historia juontaa juurensa siten 50- ja 60-luvuille [[wikipedia:fi:tietojenkäsittelytiede|tietojenkäsittelytieteen]] syntyaikohiin. [[Unix]]-järjestelmissä säännöllisiä lausekkeita on voinut hyödyntää aina ensimmäisistä versioista lähtien. Ensimmäinen grep-ohjelma kirjoitettiin ilmeisesti vuonna 1973.&amp;lt;sup&amp;gt;[http://www.columbia.edu/~rh120/ch001j.c11]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Säännöllisiä lausekkeita voi hyödyntää monissa ohjelmointikielissä (mm. Perl, Java, Python, ECMAScript). Mille tahansa [[wikipedia:en:Turing complete|Turing-täydelliselle]] ohjelmointikielelle voidaan myös aina kirjoittaa säännöllisten lausekkeiden [[wikipedia:fi:Ohjelmointikielen tulkki|tulkki]].&lt;br /&gt;
&lt;br /&gt;
== Johdatus säännöllisiin lausekkeisiin ==&lt;br /&gt;
&lt;br /&gt;
===Perusteet===&lt;br /&gt;
Säännöllinen lauseke joko &#039;&#039;vastaa&#039;&#039; tai &#039;&#039;ei vastaa&#039;&#039; merkkijonoa. Kutsutaan säännöllistä lauseketta &#039;&#039;lausekkeeksi&#039;&#039; ja merkkijonoa, jonka vastaavuus lausekkeeseen halutaan selvittää, &#039;&#039;kohteeksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lausekkeen yksinkertaiset kirjoitusmerkit vastaavat yksi-yhteen kohteen kirjoitusmerkkejä. Tämän vuoksi lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa yllätyksettömästi kohdetta&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei kohdetta&lt;br /&gt;
 bono&lt;br /&gt;
&lt;br /&gt;
Yleensä (mm. grep ja awk) katsotaan, että kohteen alussa ja lopussa voi olla mielivaltainen määrä ei-vastaavia merkkejä. Tällöin kohde (s.o. näiden komentojen tapauksessa &#039;&#039;rivi&#039;&#039;) vastaa lauseketta, jos edes jokin sen &#039;&#039;osa&#039;&#039; vastaa lauseketta. Siis grep ja awk -yhteydessä lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa kohdetta&lt;br /&gt;
 bo&#039;&#039;&#039;abba&#039;&#039;&#039;bo&lt;br /&gt;
ja&lt;br /&gt;
 dada&#039;&#039;&#039;abba&#039;&#039;&#039;gada&lt;br /&gt;
mutta ei silti kohdetta&lt;br /&gt;
 b&#039;&#039;&#039;abb&#039;&#039;&#039;bab&lt;br /&gt;
&lt;br /&gt;
===Operaattorit===&lt;br /&gt;
Yksi-yhteen vastaavien kirjoitusmerkkien lisäksi säännöllisissä lausekkeissa on mahdollisuus käyttää erilaisia &#039;&#039;operaattorimerkkejä&#039;&#039;, joilla on lausekkeessa erikoismerkitys.&lt;br /&gt;
&lt;br /&gt;
====Vaihtoehtoisuusoperaattori: &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Näistä ensimmäinen on operaattori &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;, joka tarkoittaa &#039;&#039;vaihtelua&#039;&#039; tai &#039;&#039;alternointia&#039;&#039; (engl. alternation). Sen merkitys on sama kuin luonnollisen kielen sanalla &amp;quot;tai&amp;quot;. Lauseke&lt;br /&gt;
 omena|luumu&lt;br /&gt;
vastaa sekä kohteita&lt;br /&gt;
 &#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
että&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;&lt;br /&gt;
Kun lisäksi muistamme yltä, että komentorivityökalujen tapauksessa kohde voi sisältää ei-vastaavia merkkejä sekä alussa että lopussa, vastaa ylläoleva lauseke &amp;lt;tt&amp;gt;omena|luumu&amp;lt;/tt&amp;gt; myös merkkijonoja&lt;br /&gt;
 uuni&#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
tai&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;soppa&lt;br /&gt;
Huomaa kuitenkin, että seuraavassa kohteessa vain ensimmäinen esiintymä vastaa lauseketta&lt;br /&gt;
 kotimainen &#039;&#039;&#039;omena&#039;&#039;&#039;-luumuhillo&lt;br /&gt;
&lt;br /&gt;
====Toisto-operaattorit====&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja ilmaisulla &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; on säännöllisissä lausekkeissa erikoismerkitys, joka vaikuttaa niitä &#039;&#039;välittömästi edeltävään&#039;&#039; merkkiin.&lt;br /&gt;
&lt;br /&gt;
=====Mielivaltaisen monta: &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, tai ei kertaakaan&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab*a&lt;br /&gt;
vastaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Todettakooon, että selvästi b-merkkien määrä kohteessa voi olla mielivaltainen, joten eri vastaavia kohdemerkkijonoja on olemassa myös ääretön määrä.&lt;br /&gt;
&lt;br /&gt;
=====Vähintään yksi: &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, mutta vähintään kerran&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab+a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====Ehdollinen: &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen kerran, tai ei kertaakaan&#039;&#039;&amp;quot;. Siten lauseke&lt;br /&gt;
 ab?a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bbbbbbbbbbbbbbbba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;ba&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====n:stä m:n kertaan: &amp;lt;tt&amp;gt;{n, m}&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Aina yllä olevat operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; eivät riitä, vaan jotain merkkiä tarvitsee vastata juuri tietyn määrän toistoja. Voitaisiin toki kirjoittaa&lt;br /&gt;
 aaaa?a?&lt;br /&gt;
jos halutaan vastata&lt;br /&gt;
 aaa&lt;br /&gt;
 aaaa&lt;br /&gt;
 aaaaa&lt;br /&gt;
mutta voidaan kirjoittaa lyhyemmin&lt;br /&gt;
 a{3,5}&lt;br /&gt;
Tämä tarkoittaa, että edeltävää merkkiä &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; voi esiintyä kolmesta viiteen kertaan. Käytetään yleisesti tästä ilmaisusta mallia &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; ovat mielivaltaisia kokonaislukuja, tarkoittaen &#039;&#039;&amp;quot;n:stä m:n kertaan&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Kumpi tahansa numeroista &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; voidaan jättää pois. Täten ilmaisu&lt;br /&gt;
 {n}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;tasan n kertaa&amp;quot;&#039;. Ilmaisu&lt;br /&gt;
 {n,}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;vähintään n kertaa&amp;quot;&#039;&#039;. Ilmaisu&lt;br /&gt;
 {,m}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;korkeintaan m kertaa&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sivuhuomatuksena todettakoon, että yllä olevan perusteella lyhyemmät operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; voitaisiin aina korvata ilmaisuilla &amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{1,}&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt; vastaavasti. {m,n}-muoto on kuitenkin uudempi laajennos, joka ei toimi kaikissa ohjelmassa.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Operaattori &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ei ole tuettu kaikissa säännöllisten lausekkeiden toteutuksissa. GNU grep tukee niitä laajennetussa tilassa (&amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===== Huomautuksia =====&lt;br /&gt;
Operaattoreita voi yhdistää mielivaltaisesti toisiinsa. Siten lauseke&lt;br /&gt;
 hur+a*!*&lt;br /&gt;
vastaavaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;hur&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurra&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa!&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurrraaa!!!!&#039;&#039;&#039;&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Toisaalta lauseke &#039;&#039;ei vastaa&#039;&#039; mitään seuraavista kohteista:&lt;br /&gt;
 burraa!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;aa!!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;uuurraa!!&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;urrur!!&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Tässä vaiheessa on hyvä varmistaa, että ymmärtää edellä esitetyn esimerkin kokonaisuudessaan.&lt;br /&gt;
&lt;br /&gt;
===Sulut: &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Kysymys:&#039;&#039;&#039; Jos halutaan vastata kohdetta &amp;lt;tt&amp;gt;hUrrUrrUrr&amp;lt;/tt&amp;gt; siten, että merkkijono &amp;lt;tt&amp;gt;Urr&amp;lt;/tt&amp;gt; voi esiintyä kohteessa äärettömän monta kertaa, miten tulee toimia?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vastaus:&#039;&#039;&#039; Tämä on mahdotonta tähän mennessä esitetyillä operaattoreilla. Voisimme toki kirjoittaa &amp;lt;tt&amp;gt;hU+r+r+&amp;lt;/tt&amp;gt; tai vastaavaa, mutta tämä vastaisi vain kohteita kuten &amp;lt;tt&amp;gt;hUUrrrr&amp;lt;/tt&amp;gt;. Tarvitsemme selvästi uuden operaattorin; &#039;&#039;sulut&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; voidaan määrittää lausekkeen osia, jotka samaan tapaan kuin koulumatematiikassa lasketaan &#039;&#039;ennen&#039;&#039; laskun muita osia. Koska säännöllisissä lausekkeissa ei kuitenkaan lasketa mitään, havainnollistetaan sulkujen merkitystä esittämällä ratkaisu yllä olevaan kysymykseen. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 h(Urr)+&lt;br /&gt;
vastaa kohteita&lt;br /&gt;
 &#039;&#039;&#039;hUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
jne. jne. Lauseke ei vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Arr&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Err&lt;br /&gt;
 burr&lt;br /&gt;
&lt;br /&gt;
Samoin kohde &lt;br /&gt;
 &#039;&#039;&#039;hUr&#039;&#039;&#039;&lt;br /&gt;
näyttää oikealta, mutta jää kuitenkin liian lyhyeksi, sillä sulkujen sisältö on löydyttävä kohteesta aina &#039;&#039;kokonaan&#039;&#039;. Siksi kohde &amp;lt;tt&amp;gt;hUr&amp;lt;/tt&amp;gt; &amp;lt;u&amp;gt;ei&amp;lt;/u&amp;gt; vastaa lauseketta &amp;lt;tt&amp;gt;h(Urr)+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Esimerkkejä====&lt;br /&gt;
&lt;br /&gt;
Sulkuja voi yhdistellä mielivaltaisesti kaikkiin operaattoreihin &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;. Seuraavassa on annettu sarja lausekkeita, sekä esimerkkejä kutakin vastaavista ja vastaamattomista kohteista:&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 d(ii)?pada+(pa|ba)?&lt;br /&gt;
vastaa esimerkiksi seuraavia kohteita&lt;br /&gt;
 &#039;&#039;&#039;diipadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista&lt;br /&gt;
 &#039;&#039;&#039;di&#039;&#039;&#039;padaapa&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;uu&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Viimeinen esimerkki jää lyhyeksi, sillä merkki &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; on lausekkeessa pakollinen vähintään kerran.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (hi|ha|ho)+&lt;br /&gt;
vastaa mitä tahansa kohdetta, jossa esiintyy mikä tahansa määrä merkkijonoja &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ha&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;ho&amp;lt;/tt&amp;gt; peräkkäin mielivaltaisen monta kertaa, kuitenkin vähintään kerran. Lauseke vastaa siis kaikkia seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;haha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hiha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hoho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihaho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hahohihohahi&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;e&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;u&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;uhu&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;ehe&lt;br /&gt;
&lt;br /&gt;
===Yhtä merkkiä vastaavat erikoismerkit===&lt;br /&gt;
Säännöllisissä lausekkeissa voi esiintyä myös joitain erikoismerkkejä, jotka eivät ole operaattoreita, eli ne eivät vaikuta niitä edeltäviin sulkuihin tai merkkeihin. Ne voitaisiin aina kirjoittaa lausekkeilla muotoa&lt;br /&gt;
 (merkki1|merkki2|merkki3|merkki4|...|merkkiN)&lt;br /&gt;
mutta tämä on varsin työlästä ja epäselkeää. Siksi säännöllisissä lausekkeissa on joitain erikoismerkkejä, jotka ovat oikopolkuja monimutkaisten vaihtoehtoisuuslausekkeiden kirjoittamiseen.&lt;br /&gt;
&lt;br /&gt;
====Jokerimerkki: &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Merkillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; (piste) on erikoismerkitys. Se vastaa aina &#039;&#039;mitä tahansa&#039;&#039; merkkiä. Lauseke&lt;br /&gt;
 .*&lt;br /&gt;
vastaa siis kaikkia mahdollisia kohteita - jopa tyhjää merkkijonoa, sillä operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa, että erikoisoperaattori &amp;quot;mikä tahansa merkki&amp;quot; voi esiintyä myös nolla kertaa. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (h.)+&lt;br /&gt;
vastaa siten kaikkia seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;he&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hy&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihrhy&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 rh&lt;br /&gt;
 ah&lt;br /&gt;
 oh&lt;br /&gt;
 ih&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;&lt;br /&gt;
Viimeinen esimerkki jää jälleen lyhyeksi, sillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; ei vastaa kuitenkaan &amp;quot;tyhjää&amp;quot; merkkiä.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 .upu&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
mutta myös&lt;br /&gt;
 &#039;&#039;&#039;supu&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 sepe&lt;br /&gt;
&lt;br /&gt;
====Merkkiluokat: &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan korjata ylläoleva Ankanpoika-esimerkki, voitaisiin kirjoittaa:&lt;br /&gt;
 (t|h|l|T|H|L)upu&lt;br /&gt;
joka vastaisi vain ja ainoastaan:&lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Merkkien &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; avulla voidaan määritellä kirjainluokkia siten, että seuraava merkki kohteessa vastaa vain ja ainoastaan jotain hakasulkujen välissä olevaa kirjainta. Siten äskeistä täysin vastaa lauseke on&lt;br /&gt;
 [thlTHL]upu&lt;br /&gt;
&lt;br /&gt;
Hakasulkujen välissä voidaan myös määritellä [[lokaali]]n aakkoston mukaisia välejä väliviivalla &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;. Tällöin &lt;br /&gt;
 19[4-9][0-9]|20[0-9][0-9]&lt;br /&gt;
vastaa kaikkia vuosilukuja välillä 1940-2099. Samoin &lt;br /&gt;
 Osasto [A-I]&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;Osasto A&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto B&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto C&#039;&#039;&#039;&lt;br /&gt;
 ...&lt;br /&gt;
 &#039;&#039;&#039;Osasto H&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto I&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;Osasto &#039;&#039;&#039;J&lt;br /&gt;
&lt;br /&gt;
On huomioitavaa, että myös kohteet ”Osasto b” tai ”Osasto È” saattavat vastata yllä esitettyä lausketta joissain [[lokaali|lokaaleissa]].&lt;br /&gt;
&lt;br /&gt;
Jos merkki &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; halutaan sisällyttää hakasulkuilmaisuun, se jätetään viimeiseksi. Esim.&lt;br /&gt;
 Ala[ -]aste&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;Ala aste&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Ala-aste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jos oikea hakasulku (&amp;lt;tt&amp;gt;]&amp;lt;/tt&amp;gt;) halutaan sisällyttää hakasulkuilmaukseen, se laitetaan hakasulkujen ensimmäiseksi merkiksi. Esim.&lt;br /&gt;
 []abcdef]+&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;b&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ab]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;d]f&#039;&#039;&#039;&lt;br /&gt;
jne., mutta ei&lt;br /&gt;
 [gi&lt;br /&gt;
 zo&lt;br /&gt;
&lt;br /&gt;
Hakasulkuilmaisusn merkitys voidaan kääntää asettamalla hattu &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; sen ensimmäiseksi merkiksi. Tällöin hakasulkuilmaisu vastaa mitä tahansa hakasuluissa &amp;lt;u&amp;gt;&#039;&#039;&#039;ei&#039;&#039;&#039;&amp;lt;/u&amp;gt; esiintyvää merkkiä kohteessa. Täten lauseke&lt;br /&gt;
 [^aeiouyåäö]+&lt;br /&gt;
vastaa mitä tahansa pelkistä konsonanteista, välimerkeistä ja numeroista koostuvaa kohdetta, kuten&lt;br /&gt;
 &#039;&#039;&#039;prrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;123&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hkr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;brr-hrr&#039;&#039;&#039;&lt;br /&gt;
jne. Mutta ei&lt;br /&gt;
 au&lt;br /&gt;
 aiai&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Grepin hyväksymissä säännöllisissä lausekkeissa merkin &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; voi sisällyttää hakasulkuilmaukseen laittamalla sen miksi tahansa muuksi merkiksi, kuin hakasulkujen ensimmäinen merkki. Tämä ei pidä välttämättä paikkaansa kuitenkaan kaikilla säännöllisten lausekkeiden toteutuksilla, vaan hattumerkin eteen on mahdollisesti laitettava pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=====POSIX-merkkiluokat=====&lt;br /&gt;
Joitain erikoismerkkiluokkia on määrätty ennakkoon grepissä. Esimerkiksi&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:digit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alpha:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:alnum:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa kirjainta tai numeroa&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:space:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; vastaa mitä tahansa tyhjää (esim. välilyönti, tabulaattori) merkkiä&lt;br /&gt;
&lt;br /&gt;
Muita tällaisia ovat &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:lower:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:upper:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:xdigit:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:blank:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:punct:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:print:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:cntrl:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[:graph:]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Merkkiluokat tulee laittaa lisäksi ulompien hakasulkujen &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; sisään. Esimerkiksi &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[[:upper:]]&amp;lt;/nowiki&amp;gt;+&lt;br /&gt;
joka vastaa yleensä ilmaisua&lt;br /&gt;
 [A-Z]+&lt;br /&gt;
eli mielivaltainen (vähintään yksi) määrä isoja kirjaimia A-Z.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Huom!&#039;&#039;&#039; Merkkiluokkia käytettäessä on huomioitava, että käytetty lokaali vaikuttaa ratkaisevasti siihen, mitä merkkejä luokkaan sisältyy. Siksi niitä ei voi käyttää tietoturvatarkistuksiin muuta kuin ennalta tiedetyillä lokaaleilla.&lt;br /&gt;
&lt;br /&gt;
====Pako-operaattori: &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan vastata jotain merkkiä, joka on määritelty operaattoriksi säännöllisissä lausekkeissa, sitä ei voida kirjoittaa sellaisenaan lausekkeeseen. Jos halutaan vastata tarkalleen jotain seuraavista&lt;br /&gt;
 Mitä?&lt;br /&gt;
 Missä?&lt;br /&gt;
 Milloin?&lt;br /&gt;
ei voida kirjoittaa lauseketta&lt;br /&gt;
 (Mi(tä|ssä|lloin))?&lt;br /&gt;
koska kysymysmerkki &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; lopussa vain ehdollista koko ulomman sulkuilmaisun, ja koko lauseke vastaisi siis vain joko tyhjää merkkijonoa tai kysymysmerkitöntä kysymyssanaa.&lt;br /&gt;
&lt;br /&gt;
Tarvitaan pako-operaattoria &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Merkin &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tai ylipäänsä minkä tahansa opraattorimerkin erikoismerkityksen voi poistaa asettamalla sen eteen kenoviivan. Tällöin kenoviivaa välittömästi seuraava merkki täytyy esiintyä kohteessa sellaisenaan. Oikea tapa kirjoittaa yllä oleva lauseke olisi siten&lt;br /&gt;
 (Mi(tä|ssä|lloin))\?&lt;br /&gt;
Tämä vastaa vain ja ainoastaan haluttuja merkkijonoja.&lt;br /&gt;
&lt;br /&gt;
Seuraavat operaattorit on merkittävä pako-operaattorilla, jos niitä ei haluta tulkittavan erikoismerkeiksi:&lt;br /&gt;
 ( ) | * + ? { } [ ] ^ $ \&lt;br /&gt;
&lt;br /&gt;
Siis, jos halutaan vastata kohteessa kenoviivaa, on kirjoitettava &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;. Esimerkiksi Windows-polku:&lt;br /&gt;
 &#039;&#039;&amp;lt;asema&amp;gt;&#039;&#039;:\Dokumentit\&#039;&#039;&amp;lt;nimi&amp;gt;&#039;&#039;.(doc, docx tai odt)&lt;br /&gt;
voidaan löytää esim. seuraavalla säännöllisellä lausekkeella:&lt;br /&gt;
 [A-Z]:\\Dokumentit\\[a-öA-Ö0-9 _-]+\.(doc|docx|odt)&lt;br /&gt;
&lt;br /&gt;
=== Rivin alku ja loppu: &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;===&lt;br /&gt;
On voinut herätä kysymys, kuinka voidaan vastata kohdetta (s.o. riviä) &#039;&#039;tarkalleen&#039;&#039;. Heti alussa selvisi, että esim grepin mielestä kohde (rivi) vastaa lauseketta, jos lauseke esiintyy missä tahansa kohdassa riviä. Jos halutaan, että lauseke vastaa alusta loppuun tarkalleen koko riviä, on otettava käyttöön erikoismerkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;. Nämä vastaavat kohteessa rivin tai merkkijonon alkua ja loppua kuvaavia &amp;quot;näkymättömiä&amp;quot; merkkejä vastaavasti. Siten&lt;br /&gt;
 ^abba$&lt;br /&gt;
vastaa vain riviä&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei esimerkiksi&lt;br /&gt;
 babba&lt;br /&gt;
 abbab&lt;br /&gt;
 babbab&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;abb&#039;&#039;&#039;bba&lt;br /&gt;
 ^abba&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;$&lt;br /&gt;
 ^abba$&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki ====&lt;br /&gt;
&lt;br /&gt;
Merkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; antavat viimeisen silauksen grepin tehokkaaseen hyödyntämiseen. Nyt esimerkiksi, jos tulostetaan kaikki [[prosessi]]t komennolla &amp;lt;tt&amp;gt;[[ps]] -ef&amp;lt;/tt&amp;gt;, saadaan yleensä jokseenkin tälläinen listaus (esimerkissä palvelinkone):&lt;br /&gt;
 &lt;br /&gt;
 $ ps -ef&lt;br /&gt;
 UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
 root         1     0  0 Jan21 ?        00:00:34 init [2]      &lt;br /&gt;
 root      1425     1  0 Jan31 ?        00:00:00 /usr/sbin/xinetd&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
 root      5566     1  0 Jan21 ?        00:00:05 /usr/sbin/apache2 -k start&lt;br /&gt;
 root      6091     1  0 Jan21 ?        00:00:03 /usr/sbin/cron&lt;br /&gt;
 www-data 15379  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 www-data 15386  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 root     21684 32395  0 20:37 ?        00:00:00 sshd: user [priv]&lt;br /&gt;
 user     21688 21684  0 20:37 ?        00:00:00 sshd: user@pts/1&lt;br /&gt;
 user     21689 21688  0 20:37 pts/1    00:00:00 -bash&lt;br /&gt;
 user     21705 21689  0 20:37 pts/1    00:00:00 ps -ef&lt;br /&gt;
 syslog   32279     1  0 Jan21 ?        00:00:07 /sbin/syslogd -u syslog&lt;br /&gt;
 bind     32351     1  0 Jan31 ?        00:00:00 /usr/sbin/named&lt;br /&gt;
 root     32395     1  0 Jan21 ?        00:00:22 /usr/sbin/sshd&lt;br /&gt;
 (... jne ...)&lt;br /&gt;
&lt;br /&gt;
Jos haluamme ylläolevasta listasta vain &amp;quot;qmail&amp;quot; -alkuisten [[käyttäjä|käyttäjien]] prosessit, voisimme kirjoittaa&lt;br /&gt;
 ps -ef | grep qmail&lt;br /&gt;
Tämä kuitenkin tulostaa myös kaikki sellaiset prosessit, joiden nimikentässä esiintyy &amp;quot;qmail&amp;quot; – joukossa myös käyttäjän [[root]] prosesseja vastoin alkuperäistä tarkoitusta:&lt;br /&gt;
 $ ps -ef | grep qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger &#039;&#039;&#039;qmail&#039;&#039;&#039; 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-clean&lt;br /&gt;
&lt;br /&gt;
Ratkaisu qmail -alkuisten käyttäjien prosessien listaamiseen on:&lt;br /&gt;
 $ ps -ef | grep ^qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Hattumerkki &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; alussa vastaa jokaisen listausrivin alkua, jota pitää välittömästi seurata merkkijono &amp;lt;tt&amp;gt;qmail&amp;lt;/tt&amp;gt;, ja tämän jälkeen voi tulla mikä tahansa merkkejä, koska loppumerkkiä ei ole tarkoituksella annettu. Grep tulostaa vain lausketta vastaavat rivit, ja tulos on haluttu.&lt;br /&gt;
&lt;br /&gt;
===== Pako komentotulkista =====&lt;br /&gt;
Jos halutaan antaa jokin monimutkaisempi ilmaisu, on hyvä asettaa säännöllinen lauseke yksinkertaisten heittomerkkien &amp;lt;tt&amp;gt;&#039;&amp;lt;/tt&amp;gt; sisään, jotta ne regexp-operaattorit, joillla on jokin erikoismerkitys [[komentotulkki|komeotulkissa]] eivät aiheuta ongelmia.&lt;br /&gt;
 $ echo moi | egrep m(o|a)i&lt;br /&gt;
 -bash: syntax error near unexpected token `(&#039;&lt;br /&gt;
Sululla &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; on erikoismerkitys komentotulkissa, samoin merkillä &amp;lt;tt&amp;gt;[[putki||]]&amp;lt;/tt&amp;gt;. Ratkaisu:&lt;br /&gt;
 $ echo moi | egrep &#039;m(o|a)i&#039;&lt;br /&gt;
 moi&lt;br /&gt;
&lt;br /&gt;
===== Laajennetut säännölliset lausekkeet: egrep =====&lt;br /&gt;
Esimerkissä käytettiin komentoa &amp;lt;tt&amp;gt;egrep&amp;lt;/tt&amp;gt;. Se on oikopolku grepin [[valitsin|valitsimelle]] &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;, joka ottaa säännöllisten lausekkeiden laajennetun (engl. extended) tuen käyttöön. Normaalissa käytössä (pelkkä komento &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) operaattorit &amp;lt;tt&amp;gt;? + {} | (&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; eivät ole käytettävissä, paitsi asettamalla niiden eteen pako-operaattorin &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== Prosessoitu tuloste: awk =====&lt;br /&gt;
Jos ylläolevassa prosessilistausesimerkissä halutaan tulostaa pelkät prosessien [[PID]]-numerot, voidaan käyttää [[awk]]-työkalua seuraavasti:&lt;br /&gt;
 $ ps -ef | awk &#039;/^qmail/ { print $2 }&#039;&lt;br /&gt;
 3986&lt;br /&gt;
 3990&lt;br /&gt;
 3994&lt;br /&gt;
 3995&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä lausekkeista ==&lt;br /&gt;
Web-kuva:&lt;br /&gt;
 [^ ]+\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)&lt;br /&gt;
Päivämäärä muotoa pp.kk.vvvv:&lt;br /&gt;
 [0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}&lt;br /&gt;
2-merkkinen [[wikipedia:fi:heksadesimaalijärjestelmä|heksadesimaali]]:&lt;br /&gt;
 [0-9A-Fa-f]{2}&lt;br /&gt;
Sähköpostiosoite:&lt;br /&gt;
 [a-zA-Z0-9_]+@[a-zA-Z0-9_\.]+\.[a-zA-Z]{2,3}&lt;br /&gt;
&lt;br /&gt;
== Laajennukset ==&lt;br /&gt;
Lukuunottamatta operaattoria &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; ja POSIX-luokkia (&amp;lt;tt&amp;gt;[[:luokka:]]&amp;lt;/tt&amp;gt; jne.) yllä esitetty on pitkälti universaalisti tuettua säännöllisten lausekkeiden eri toteutuksissa. Monissa toteutuksissa on kuitenkin tehty laajennuksia tähän, mutta esim. [[grep]] ei tue seuraavia. &lt;br /&gt;
&lt;br /&gt;
=== Pakoluokat ===&lt;br /&gt;
Jos halutaan kirjoittaa lauseke, joka jossain kohtaa vastaa mitä tahansa numeromerkkiä, voidaan kirjoittaa hakasulkuilmaus &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;. Tälläisille yleisesti käytetyille luokille on kuitenkin olemassa laajennuksissa helpompia nimiä. Kutsutaan näitä &#039;&#039;pakoluokiksi&#039;&#039;. Ne muistuttavat läheisesti [[#POSIX-merkkiluokat|POSIX-merkkiluokkia]], mutta ovat lyhyempiä.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style: solid; border-collapse: collapse&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+&#039;&#039;&#039;Pakoluokat&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Ilmaisu !! Merkitys !! Vastaava hakasulkuilmaus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; || Mikä tahansa aakkonen a-z, numero tai alaviiva &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt;. || &amp;lt;tt&amp;gt;[a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\W&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa muu kuin aakkonen a-z, numero tai alaviiva. || &amp;lt;tt&amp;gt;[^a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; || Mikä tahansa tyhjä merkki (esim. välilyönti tai tabulaattori) || esim. &amp;lt;tt&amp;gt;[ \t]&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; tabulaattorimerkki&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-tyhjä merkki || esim. &amp;lt;tt&amp;gt;[^ \t]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; || Mikä tahansa numero. || &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\D&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-numero. || &amp;lt;tt&amp;gt;[^0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 \d+&lt;br /&gt;
vastaa siis kaikkia numeroita aivan siinä missä myös&lt;br /&gt;
 [0-9]+&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Grep]] ja [[Awk]]&lt;br /&gt;
** [[Putki]]&lt;br /&gt;
* [[Ed]] ja [[Sed]]: tuki säännöllisille lausekkeille&lt;br /&gt;
* [[Vi]] ja [[vim]]: näiden graaffinen tila&lt;br /&gt;
* [[Emacs]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[[wikipedia:fi:säännöllinen lauseke|Säännöllinen lauseke]]&lt;br /&gt;
*[[wikipedia:fi:äärellinen automaatti|Äärellinen automaatti]]&lt;br /&gt;
*[[wikipedia:fi:pinoautomaatti|Pinoautomaatti]]&lt;br /&gt;
*[[wikipedia:fi:turingin kone|Turingin kone]]&lt;br /&gt;
*[http://www.ohjelmointiputka.net/opas.php?tunnus=phpsl Säännölliset lausekkeet PHP:ssä] -opas Ohjelmointiputkassa&lt;br /&gt;
*[http://swtch.com/~rsc/regexp/regexp1.html Regular Expression Matching Can Be Simple And Fast]: Keskustelua säännöllisten lausekkeiden toteutuksesta C-kielellä englanniksi.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Last.fm&amp;diff=30766</id>
		<title>Last.fm</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Last.fm&amp;diff=30766"/>
		<updated>2010-02-17T14:08:55Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: -epävirallinen pakettilähde, tässä puhutaan virallisista paketeista&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Ohjelma &lt;br /&gt;
| nimi= Last.fm&lt;br /&gt;
| kuva=[[kuva: Lastfm.png|250px]] &lt;br /&gt;
| kuvateksti= &lt;br /&gt;
| lisenssi=avoin lähdekoodi&lt;br /&gt;
| käyttöliittymä=[[QT]]&lt;br /&gt;
| kotisivu=[http://www.last.fm www.last.fm]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Last.fm soitin on mediasoitinohjelmisto, joka hyödyntää [http://www.last.fm Last.fm] nettiradiopalvelua.&lt;br /&gt;
Ohjelma on saatavissa Linux-, Windows- ja Mac OS X -käyttöjärjestelmille.&lt;br /&gt;
&lt;br /&gt;
==Asennus==&lt;br /&gt;
===Ubuntu ja Debian===&lt;br /&gt;
Last.Fm löytyy [[Ubuntu]]n paketinhallinnasta nimellä lastfm. Lisätietoja ohjelmien asentamisesta löytyy artikkelista [[Ohjelmien asentaminen]].&lt;br /&gt;
&lt;br /&gt;
Last.fm voi myös asentaa [[Ubuntu]]un ja [[Debian]]iin ottamalla käyttöön epävirallisen [[apt]]-pakettilähteen. [http://apt.last.fm/ Kotisivulta] löytyvillä ohjeilla ja asentamalla tämän jälkeen paketin &amp;lt;tt&amp;gt;lastfm&amp;lt;/tt&amp;gt;. Lisätietoja ohjelmien asentamisesta löytyy artikkelista [[Ohjelmien asentaminen]].&lt;br /&gt;
&lt;br /&gt;
===Asennus lähdekoodeista===&lt;br /&gt;
Kopioi Last.fm lähdekoodipaketti [http://www.last.fm/download kotisivulta].&lt;br /&gt;
ja pura se komentorivi komennolla.&lt;br /&gt;
&lt;br /&gt;
 tar last.fm-1.4.2.58240.src.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Huomioi [[Qt]]:n &amp;lt;tt&amp;gt;qt-devel&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;qt-config&amp;lt;/tt&amp;gt; paketit ovat asennettu.&lt;br /&gt;
&lt;br /&gt;
Tämän jälkeen ohjelma täytyy [[Kääntäminen|kääntää]] [[komentorivi]]llä komennoilla:&lt;br /&gt;
 ./configure&lt;br /&gt;
 [[make]]&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
===Kehitysversion asentaminen===&lt;br /&gt;
Kehitysversion [[lähdekoodi]]n voi hakea ohjelmiston [[Svn]]-[[versionhallinta|versionhallinnasta]] komennolla&lt;br /&gt;
&lt;br /&gt;
 svn://svn.audioscrobbler.net/clientside/Last.fm&lt;br /&gt;
&lt;br /&gt;
Tämän jälkeen ohjelma täytyy [[Kääntäminen|kääntää]] [[komentorivi]]llä komennoilla:&lt;br /&gt;
 ./configure&lt;br /&gt;
 [[make]]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Multimedia]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30755</id>
		<title>Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30755"/>
		<updated>2010-02-17T00:33:56Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: /* Esimerkki */ fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Säännöllinen lauseke&#039;&#039;&#039; (engl. &#039;&#039;&#039;regular expression&#039;&#039;&#039;, &#039;&#039;&#039;regexp&#039;&#039;&#039;) on yksinkertainen merkkijonokieli, joka voi joko &#039;&#039;vastata&#039;&#039; tai &#039;&#039;olla vastaamatta&#039;&#039; jotain toista merkkijonoa.  Linux- ja Unix-järjestelmissä säännöllisiä lauskkeista on suurta hyötyä [[komentorivi]]ä käytettäessä, mm. komennoissa [[awk]] ja [[grep]]. Niiden voidaankin sanoa olevan [[putki]]ttamiseen yhdistettynä tärkeimpiä työkaluja, joita komentorivin edistynyt käyttö edellyttää.&lt;br /&gt;
&lt;br /&gt;
== Teoriaa ==&lt;br /&gt;
Tietojenkäsittelytieteessä puhutaan [[wikipedia:fi:säännöllinen kieli|säännöllisestä kielestä]], joka voidaan tunnistaa [[wikipedia:fi:äärellinen automaatti|äärellisellä automaatilla]]. Säännöllisiä lausekkeita käytetään myös monissa ohjelmointikielissä (mm. Perl, Java, Python, ECMAScript). Mille tahansa [[wikipedia:en:Turing complete|Turing-täydelliselle]] ohjelmointikielelle voidaan kuitenkin aina kirjoittaa säännöllisten lausekkeiden [[wikipedia:fi:Ohjelmointikielen tulkki|tulkki]].&lt;br /&gt;
&lt;br /&gt;
== Johdatus säännöllisiin lausekkeisiin ==&lt;br /&gt;
&lt;br /&gt;
===Perusteet===&lt;br /&gt;
Säännöllinen lauseke joko &#039;&#039;vastaa&#039;&#039; tai &#039;&#039;ei vastaa&#039;&#039; merkkijonoa. Kutsutaan säännöllistä lauseketta &#039;&#039;lausekkeeksi&#039;&#039; ja merkkijonoa, jonka vastaavuus lausekkeeseen halutaan selvittää, &#039;&#039;kohteeksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lausekkeen yksinkertaiset kirjoitusmerkit vastaavat yksi-yhteen kohteen kirjoitusmerkkejä. Tämän vuoksi lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa yllätyksettömästi kohdetta&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei kohdetta&lt;br /&gt;
 bono&lt;br /&gt;
&lt;br /&gt;
Yleensä (mm. grep ja awk) katsotaan, että kohteen alussa ja lopussa voi olla mielivaltainen määrä ei-vastaavia merkkejä. Tällöin kohde (s.o. näiden komentojen tapauksessa &#039;&#039;rivi&#039;&#039;) vastaa lauseketta, jos edes jokin sen &#039;&#039;osa&#039;&#039; vastaa lauseketta. Siis grep ja awk -yhteydessä lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa kohdetta&lt;br /&gt;
 bo&#039;&#039;&#039;abba&#039;&#039;&#039;bo&lt;br /&gt;
ja&lt;br /&gt;
 dada&#039;&#039;&#039;abba&#039;&#039;&#039;gada&lt;br /&gt;
mutta ei silti kohdetta&lt;br /&gt;
 b&#039;&#039;&#039;abb&#039;&#039;&#039;bab&lt;br /&gt;
&lt;br /&gt;
===Operaattorit===&lt;br /&gt;
Yksi-yhteen vastaavien kirjoitusmerkkien lisäksi säännöllisissä lausekkeissa on mahdollisuus käyttää erilaisia &#039;&#039;operaattorimerkkejä&#039;&#039;, joilla on lausekkeessa erikoismerkitys.&lt;br /&gt;
&lt;br /&gt;
====Vaihtoehtoisuusoperaattori: &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Näistä ensimmäinen on operaattori &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;, joka tarkoittaa &#039;&#039;vaihtelua&#039;&#039; tai &#039;&#039;alternointia&#039;&#039; (engl. alternation). Sen merkitys on sama kuin luonnollisen kielen sanalla &amp;quot;tai&amp;quot;. Lauseke&lt;br /&gt;
 omena|luumu&lt;br /&gt;
vastaa sekä kohteita&lt;br /&gt;
 &#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
että&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;&lt;br /&gt;
Kun lisäksi muistamme yltä, että komentorivityökalujen tapauksessa kohde voi sisältää ei-vastaavia merkkejä sekä alussa että lopussa, vastaa ylläoleva lauseke &amp;lt;tt&amp;gt;omena|luumu&amp;lt;/tt&amp;gt; myös merkkijonoja&lt;br /&gt;
 uuni&#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
tai&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;soppa&lt;br /&gt;
Huomaa kuitenkin, että seuraavassa kohteessa vain ensimmäinen esiintymä vastaa lauseketta&lt;br /&gt;
 kotimainen &#039;&#039;&#039;omena&#039;&#039;&#039;-luumuhillo&lt;br /&gt;
&lt;br /&gt;
====Toisto-operaattorit====&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja ilmaisulla &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; on säännöllisissä lausekkeissa erikoismerkitys, joka vaikuttaa niitä &#039;&#039;välittömästi edeltävään&#039;&#039; merkkiin.&lt;br /&gt;
&lt;br /&gt;
=====Mielivaltaisen monta: &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, tai ei kertaakaan&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab*a&lt;br /&gt;
vastaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Todettakooon, että selvästi b-merkkien määrä kohteessa voi olla mielivaltainen, joten eri vastaavia kohdemerkkijonoja on olemassa myös ääretön määrä.&lt;br /&gt;
&lt;br /&gt;
=====Vähintään yksi: &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, mutta vähintään kerran&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab+a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====Ehdollinen: &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen kerran, tai ei kertaakaan&#039;&#039;&amp;quot;. Siten lauseke&lt;br /&gt;
 ab?a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bbbbbbbbbbbbbbbba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;ba&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====n:stä m:n kertaan: &amp;lt;tt&amp;gt;{n, m}&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Aina yllä olevat operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; eivät riitä, vaan jotain merkkiä tarvitsee vastata juuri tietyn määrän toistoja. Voitaisiin toki kirjoittaa&lt;br /&gt;
 aaaa?a?&lt;br /&gt;
jos halutaan vastata&lt;br /&gt;
 aaa&lt;br /&gt;
 aaaa&lt;br /&gt;
 aaaaa&lt;br /&gt;
mutta voidaan kirjoittaa lyhyemmin&lt;br /&gt;
 a{3,5}&lt;br /&gt;
Tämä tarkoittaa, että edeltävää merkkiä &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; voi esiintyä kolmesta viiteen kertaan. Käytetään yleisesti tästä ilmaisusta mallia &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; ovat mielivaltaisia kokonaislukuja, tarkoittaen &#039;&#039;&amp;quot;n:stä m:n kertaan&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Kumpi tahansa numeroista &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; voidaan jättää pois. Täten ilmaisu&lt;br /&gt;
 {n}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;tasan n kertaa&amp;quot;&#039;. Ilmaisu&lt;br /&gt;
 {n,}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;vähintään n kertaa&amp;quot;&#039;&#039;. Ilmaisu&lt;br /&gt;
 {,m}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;korkeintaan m kertaa&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sivuhuomatuksena todettakoon, että yllä olevan perusteella lyhyemmät operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; voitaisiin aina korvata ilmaisuilla &amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{1,}&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt; vastaavasti.&lt;br /&gt;
&lt;br /&gt;
===== Huomautuksia =====&lt;br /&gt;
Operaattoreita voi yhdistää mielivaltaisesti toisiinsa. Siten lauseke&lt;br /&gt;
 hur+a*!*&lt;br /&gt;
vastaavaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;hur&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurra&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa!&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurrraaa!!!!&#039;&#039;&#039;&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Toisaalta lauseke &#039;&#039;ei vastaa&#039;&#039; mitään seuraavista kohteista:&lt;br /&gt;
 burraa!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;aa!!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;uuurraa!!&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;urrur!!&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Tässä vaiheessa on hyvä varmistaa, että ymmärtää edellä esitetyn esimerkin kokonaisuudessaan.&lt;br /&gt;
&lt;br /&gt;
===Sulut: &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Kysymys:&#039;&#039;&#039; Jos halutaan vastata kohdetta &amp;lt;tt&amp;gt;hUrrUrrUrr&amp;lt;/tt&amp;gt; siten, että merkkijono &amp;lt;tt&amp;gt;Urr&amp;lt;/tt&amp;gt; voi esiintyä kohteessa äärettömän monta kertaa, miten tulee toimia?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vastaus:&#039;&#039;&#039; Tämä on mahdotonta tähän mennessä esitetyillä operaattoreilla. Voisimme toki kirjoittaa &amp;lt;tt&amp;gt;hU+r+r+&amp;lt;/tt&amp;gt; tai vastaavaa, mutta tämä vastaisi vain kohteita kuten &amp;lt;tt&amp;gt;hUUrrrr&amp;lt;/tt&amp;gt;. Tarvitsemme selvästi uuden operaattorin; &#039;&#039;sulut&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; voidaan määrittää lausekkeen osia, jotka samaan tapaan kuin koulumatematiikassa lasketaan &#039;&#039;ennen&#039;&#039; laskun muita osia. Koska säännöllisissä lausekkeissa ei kuitenkaan lasketa mitään, havainnollistetaan sulkujen merkitystä esittämällä ratkaisu yllä olevaan kysymykseen. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 h(Urr)+&lt;br /&gt;
vastaa kohteita&lt;br /&gt;
 &#039;&#039;&#039;hUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
jne. jne. Lauseke ei vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Arr&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Err&lt;br /&gt;
 burr&lt;br /&gt;
&lt;br /&gt;
Samoin kohde &lt;br /&gt;
 &#039;&#039;&#039;hUr&#039;&#039;&#039;&lt;br /&gt;
näyttää oikealta, mutta jää kuitenkin liian lyhyeksi, sillä sulkujen sisältö on löydyttävä kohteesta aina &#039;&#039;kokonaan&#039;&#039;. Siksi kohde &amp;lt;tt&amp;gt;hUr&amp;lt;/tt&amp;gt; &amp;lt;u&amp;gt;ei&amp;lt;/u&amp;gt; vastaa lauseketta &amp;lt;tt&amp;gt;h(Urr)+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Esimerkkejä====&lt;br /&gt;
&lt;br /&gt;
Sulkuja voi yhdistellä mielivaltaisesti kaikkiin operaattoreihin &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;. Seuraavassa on annettu sarja lausekkeita, sekä esimerkkejä kutakin vastaavista ja vastaamattomista kohteista:&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 d(ii)?pada+(pa|ba)?&lt;br /&gt;
vastaa esimerkiksi seuraavia kohteita&lt;br /&gt;
 &#039;&#039;&#039;diipadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista&lt;br /&gt;
 &#039;&#039;&#039;di&#039;&#039;&#039;padaapa&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;uu&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Viimeinen esimerkki jää lyhyeksi, sillä merkki &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; on lausekkeessa pakollinen vähintään kerran.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (hi|ha|ho)+&lt;br /&gt;
vastaa mitä tahansa kohdetta, jossa esiintyy mikä tahansa määrä merkkijonoja &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ha&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;ho&amp;lt;/tt&amp;gt; peräkkäin mielivaltaisen monta kertaa, kuitenkin vähintään kerran. Lauseke vastaa siis kaikkia seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;haha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hiha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hoho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihaho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hahohihohahi&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;e&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;u&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;uhu&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;ehe&lt;br /&gt;
&lt;br /&gt;
===Yhtä merkkiä vastaavat erikoismerkit===&lt;br /&gt;
Säännöllisissä lausekkeissa voi esiintyä myös joitain erikoismerkkejä, jotka eivät ole operaattoreita, eli ne eivät vaikuta niitä edeltäviin sulkuihin tai merkkeihin. Ne voitaisiin aina kirjoittaa lausekkeilla muotoa&lt;br /&gt;
 (merkki1|merkki2|merkki3|merkki4|...|merkkiN)&lt;br /&gt;
mutta tämä on varsin työlästä ja epäselkeää. Siksi säännöllisissä lausekkeissa on joitain erikoismerkkejä, jotka ovat oikopolkuja monimutkaisten vaihtoehtoisuuslausekkeiden kirjoittamiseen.&lt;br /&gt;
&lt;br /&gt;
====Jokerimerkki: &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Merkillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; (piste) on erikoismerkitys. Se vastaa aina &#039;&#039;mitä tahansa&#039;&#039; merkkiä. Lauseke&lt;br /&gt;
 .*&lt;br /&gt;
vastaa siis kaikkia mahdollisia kohteita - jopa tyhjää merkkijonoa, sillä operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa, että erikoisoperaattori &amp;quot;mikä tahansa merkki&amp;quot; voi esiintyä myös nolla kertaa. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (h.)+&lt;br /&gt;
vastaa siten kaikkia seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;he&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hy&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihrhy&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 rh&lt;br /&gt;
 ah&lt;br /&gt;
 oh&lt;br /&gt;
 ih&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;&lt;br /&gt;
Viimeinen esimerkki jää jälleen lyhyeksi, sillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; ei vastaa kuitenkaan &amp;quot;tyhjää&amp;quot; merkkiä.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 .upu&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
mutta myös&lt;br /&gt;
 &#039;&#039;&#039;supu&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 sepe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Merkkiluokat: &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan korjata ylläoleva Ankanpoika-esimerkki, voitaisiin kirjoittaa:&lt;br /&gt;
 (t|h|l|T|H|L)upu&lt;br /&gt;
joka vastaisi vain ja ainoastaan:&lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Merkkien &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; avulla voidaan määritellä kirjainluokkia siten, että seuraava merkki kohteessa vastaa vain ja ainoastaan jotain hakasulkujen välissä olevaa kirjainta. Siten äskeistä täysin vastaa lauseke on&lt;br /&gt;
 [thlTHL]upu&lt;br /&gt;
&lt;br /&gt;
Hakasulkujen välissä voidaan myös määritellä aakkoston mukaisia välejä väliviivalla &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;. Tällöin &lt;br /&gt;
 19[4-9][0-9]|20[0-9][0-9]&lt;br /&gt;
vastaa kaikkia vuosilukuja välillä 1940-2099. Samoin &lt;br /&gt;
 Osasto [A-I]&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;Osasto A&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto B&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto C&#039;&#039;&#039;&lt;br /&gt;
 ...&lt;br /&gt;
 &#039;&#039;&#039;Osasto H&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto I&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;Osasto &#039;&#039;&#039;J&lt;br /&gt;
&lt;br /&gt;
Jos merkki &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; halutaan sisällyttää hakasulkuilmaisuun, se jätetään viimeiseksi. Esim.&lt;br /&gt;
 Ala[ -]aste&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;Ala aste&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Ala-aste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jos oikea hakasulku (&amp;lt;tt&amp;gt;]&amp;lt;/tt&amp;gt;) halutaan sisällyttää hakasulkuilmaukseen, se laitetaan hakasulkujen ensimmäiseksi merkiksi. Esim.&lt;br /&gt;
 []abcdef]+&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;b&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ab]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;d]f&#039;&#039;&#039;&lt;br /&gt;
jne., mutta ei&lt;br /&gt;
 [gi&lt;br /&gt;
 zo&lt;br /&gt;
&lt;br /&gt;
Hakasulkuilmaisusn merkitys voidaan kääntää asettamalla hattu &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; sen ensimmäiseksi merkiksi. Tällöin hakasulkuilmaisu vastaa mitä tahansa hakasuluissa &amp;lt;u&amp;gt;&#039;&#039;&#039;ei&#039;&#039;&#039;&amp;lt;/u&amp;gt; esiintyvää merkkiä kohteessa. Täten lauseke&lt;br /&gt;
 [^aeiouyåäö]+&lt;br /&gt;
vastaa mitä tahansa pelkistä konsonanteista, välimerkeistä ja numeroista koostuvaa kohdetta, kuten&lt;br /&gt;
 &#039;&#039;&#039;prrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;123&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hkr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;brr-hrr&#039;&#039;&#039;&lt;br /&gt;
jne. Mutta ei&lt;br /&gt;
 au&lt;br /&gt;
 aiai&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Grepin hyväksymissä säännöllisissä lausekkeissa merkin &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; voi sisällyttää hakasulkuilmaukseen laittamalla sen miksi tahansa muuksi merkiksi, kuin hakasulkujen ensimmäinen merkki. Tämä ei pidä välttämättä paikkaansa kuitenkaan kaikilla säännöllisten lausekkeiden toteutuksilla, vaan hattumerkin eteen on mahdollisesti laitettava pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Pako-operaattori: &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan vastata jotain merkkiä, joka on määritelty operaattoriksi säännöllisissä lausekkeissa, sitä ei voida kirjoittaa sellaisenaan lausekkeeseen. Jos halutaan vastata tarkalleen jotain seuraavista&lt;br /&gt;
 Mitä?&lt;br /&gt;
 Missä?&lt;br /&gt;
 Milloin?&lt;br /&gt;
ei voida kirjoittaa lauseketta&lt;br /&gt;
 (Mi(tä|ssä|lloin))?&lt;br /&gt;
koska kysymysmerkki &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; lopussa vain ehdollista koko ulomman sulkuilmaisun, ja koko lauseke vastaisi siis vain joko tyhjää merkkijonoa tai kysymysmerkitöntä kysymyssanaa.&lt;br /&gt;
&lt;br /&gt;
Tarvitaan pako-operaattoria &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Merkin &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tai ylipäänsä minkä tahansa opraattorimerkin erikoismerkityksen voi poistaa asettamalla sen eteen kenoviivan. Tällöin kenoviivaa välittömästi seuraava merkki täytyy esiintyä kohteessa sellaisenaan. Oikea tapa kirjoittaa yllä oleva lauseke olisi siten&lt;br /&gt;
 (Mi(tä|ssä|lloin))\?&lt;br /&gt;
Tämä vastaa vain ja ainoastaan haluttuja merkkijonoja.&lt;br /&gt;
&lt;br /&gt;
Seuraavat operaattorit on merkittävä pako-operaattorilla, jos niitä ei haluta tulkittavan erikoismerkeiksi:&lt;br /&gt;
 ( ) | * + ? { } [ ] ^ $ \&lt;br /&gt;
&lt;br /&gt;
Siis, jos halutaan vastata kohteessa kenoviivaa, on kirjoitettava &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;. Esimerkiksi Windows-polku:&lt;br /&gt;
 &#039;&#039;&amp;lt;asema&amp;gt;&#039;&#039;:\Dokumentit\&#039;&#039;&amp;lt;nimi&amp;gt;&#039;&#039;.(doc, docx tai odt)&lt;br /&gt;
voidaan löytää esim. seuraavalla säännöllisellä lausekkeella:&lt;br /&gt;
 [A-Z]:\\Dokumentit\\[a-öA-Ö0-9 _-]+\.(doc|docx|odt)&lt;br /&gt;
&lt;br /&gt;
=== Rivin alku ja loppu: &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;===&lt;br /&gt;
On voinut herätä kysymys, kuinka voidaan vastata kohdetta (s.o. riviä) &#039;&#039;tarkalleen&#039;&#039;. Heti alussa selvisi, että esim grepin mielestä kohde (rivi) vastaa lauseketta, jos lauseke esiintyy missä tahansa kohdassa riviä. Jos halutaan, että lauseke vastaa alusta loppuun tarkalleen koko riviä, on otettava käyttöön erikoismerkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;. Nämä vastaavat kohteessa rivin tai merkkijonon alkua ja loppua kuvaavia &amp;quot;näkymättömiä&amp;quot; merkkejä vastaavasti. Siten&lt;br /&gt;
 ^abba$&lt;br /&gt;
vastaa vain riviä&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei esimerkiksi&lt;br /&gt;
 babba&lt;br /&gt;
 abbab&lt;br /&gt;
 babbab&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;abb&#039;&#039;&#039;bba&lt;br /&gt;
 ^abba&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;$&lt;br /&gt;
 ^abba$&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki ====&lt;br /&gt;
&lt;br /&gt;
Merkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; antavat viimeisen silauksen grepin tehokkaaseen hyödyntämiseen. Nyt esimerkiksi, jos tulostetaan kaikki [[prosessi]]t komennolla &amp;lt;tt&amp;gt;[[ps]] -ef&amp;lt;/tt&amp;gt;, saadaan yleensä jokseenkin tälläinen listaus (esimerkissä palvelinkone):&lt;br /&gt;
 &lt;br /&gt;
 $ ps -ef&lt;br /&gt;
 UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
 root         1     0  0 Jan21 ?        00:00:34 init [2]      &lt;br /&gt;
 root      1425     1  0 Jan31 ?        00:00:00 /usr/sbin/xinetd&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
 root      5566     1  0 Jan21 ?        00:00:05 /usr/sbin/apache2 -k start&lt;br /&gt;
 root      6091     1  0 Jan21 ?        00:00:03 /usr/sbin/cron&lt;br /&gt;
 www-data 15379  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 www-data 15386  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 root     21684 32395  0 20:37 ?        00:00:00 sshd: user [priv]&lt;br /&gt;
 user     21688 21684  0 20:37 ?        00:00:00 sshd: user@pts/1&lt;br /&gt;
 user     21689 21688  0 20:37 pts/1    00:00:00 -bash&lt;br /&gt;
 user     21705 21689  0 20:37 pts/1    00:00:00 ps -ef&lt;br /&gt;
 syslog   32279     1  0 Jan21 ?        00:00:07 /sbin/syslogd -u syslog&lt;br /&gt;
 bind     32351     1  0 Jan31 ?        00:00:00 /usr/sbin/named&lt;br /&gt;
 root     32395     1  0 Jan21 ?        00:00:22 /usr/sbin/sshd&lt;br /&gt;
 (... jne ...)&lt;br /&gt;
&lt;br /&gt;
Jos haluamme ylläolevasta listasta vain &amp;quot;qmail&amp;quot; -alkuisten [[käyttäjä|käyttäjien]] prosessit, voisimme kirjoittaa&lt;br /&gt;
 ps -ef | grep qmail&lt;br /&gt;
Tämä kuitenkin tulostaa myös kaikki sellaiset prosessit, joiden nimikentässä esiintyy &amp;quot;qmail&amp;quot; – joukossa myös käyttäjän [[root]] prosesseja vastoin alkuperäistä tarkoitusta:&lt;br /&gt;
 $ ps -ef | grep qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger &#039;&#039;&#039;qmail&#039;&#039;&#039; 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-clean&lt;br /&gt;
&lt;br /&gt;
Ratkaisu qmail -alkuisten käyttäjien prosessien listaamiseen on:&lt;br /&gt;
 $ ps -ef | grep ^qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Hattumerkki &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; alussa vastaa jokaisen listausrivin alkua, jota pitää välittömästi seurata merkkijono &amp;lt;tt&amp;gt;qmail&amp;lt;/tt&amp;gt;, ja tämän jälkeen voi tulla mikä tahansa merkkejä, koska loppumerkkiä ei ole tarkoituksella annettu. Grep tulostaa vain lausketta vastaavat rivit, ja tulos on haluttu.&lt;br /&gt;
&lt;br /&gt;
===== Pako komentotulkista =====&lt;br /&gt;
Jos halutaan antaa jokin monimutkaisempi ilmaisu, on hyvä asettaa säännöllinen lauseke yksinkertaisten heittomerkkien &amp;lt;tt&amp;gt;&#039;&amp;lt;/tt&amp;gt; sisään, jotta ne regexp-operaattorit, joillla on jokin erikoismerkitys [[komentotulkki|komeotulkissa]] eivät aiheuta ongelmia.&lt;br /&gt;
 $ echo moi | egrep m(o|a)i&lt;br /&gt;
 -bash: syntax error near unexpected token `(&#039;&lt;br /&gt;
Sululla &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; on erikoismerkitys komentotulkissa, samoin merkillä &amp;lt;tt&amp;gt;[[putki||]]&amp;lt;/tt&amp;gt;. Ratkaisu:&lt;br /&gt;
 $ echo moi | egrep &#039;m(o|a)i&#039;&lt;br /&gt;
 moi&lt;br /&gt;
Esimerkissä käytettiin komentoa egrep. Se on oikopolku grepin [[valitsin|valitsimelle]] &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;, joka ottaa säännöllisten lausekkeiden laajennetun tuen käyttöön. Normaalissa käytössä (pelkkö komento &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) operaattorit &amp;lt;tt&amp;gt;? + {} | (&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; eivät ole käytettävissä, paitsi asettamalla niiden eteen pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Jos ylläolevassa prosessilistausesimerkissä halutaan tulostaa pelkät prosessien [[PID]]-numerot, voidaan käyttää [[awk]]-työkalua seuraavasti:&lt;br /&gt;
 $ ps -ef | awk &#039;/^qmail/ { print $2 }&#039;&lt;br /&gt;
 3986&lt;br /&gt;
 3990&lt;br /&gt;
 3994&lt;br /&gt;
 3995&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä lausekkeista ==&lt;br /&gt;
Web-kuva:&lt;br /&gt;
 [^ ]+\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)&lt;br /&gt;
Päivämäärä muotoa pp.kk.vvvv:&lt;br /&gt;
 [0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}&lt;br /&gt;
2-merkkinen [[wikipedia:fi:heksadesimaalijärjestelmä|heksadesimaali]]:&lt;br /&gt;
 [0-9A-Fa-f]{2}&lt;br /&gt;
Sähköpostiosoite:&lt;br /&gt;
 [a-zA-Z0-9_]+@[a-zA-Z0-9_\.]+\.[a-zA-Z]{2,3}&lt;br /&gt;
&lt;br /&gt;
== Laajennukset ==&lt;br /&gt;
Yllä esitetty on hyvä lähtökohta säännöllisiin lausekkeisiin, ja kaikki modernit [[POSIX]]-yhteensopivat toteutukset tukevat mainittuja operaattoreita ja erikoismerkkejä. Monissa ohjelmointikielissä on tehty laajennuksia tähän, mutta esim. [[grep]] ei tue seuraavia. &lt;br /&gt;
&lt;br /&gt;
=== Pakoluokat ===&lt;br /&gt;
Jos halutaan kirjoittaa lause, joka jossain kohtaa vastaa mitä tahansa numeromerkkiä, voidaan kirjoittaa hakasulkuilmaus &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;. Tälläisille yleisesti käytetyille luokille on kuitenkin olemassa laajennuksissa helpompia nimiä. Kutsutaan näitä &#039;&#039;pakoluokiksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style: solid; border-collapse: collapse&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+&#039;&#039;&#039;Pakoluokat&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Ilmaisu !! Merkitys !! Vastaava hakasulkuilmaus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; || Mikä tahansa aakkonen a-z, numero tai alaviiva &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt;. || &amp;lt;tt&amp;gt;[a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\W&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa muu kuin aakkonen a-z, numero tai alaviiva. || &amp;lt;tt&amp;gt;[^a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; || Mikä tahansa tyhjä merkki (esim. välilyönti tai tabulaattori) || esim. &amp;lt;tt&amp;gt;[ \t]&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; tabulaattorimerkki&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-tyhjä merkki || esim. &amp;lt;tt&amp;gt;[^ \t]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; || Mikä tahansa numero. || &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\D&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-numero. || &amp;lt;tt&amp;gt;[^0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 \d+&lt;br /&gt;
vastaa siis kaikkia numeroita aivan siinä missä myös&lt;br /&gt;
 [0-9]+&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Grep]] ja [[Awk]]&lt;br /&gt;
** [[Putki]]&lt;br /&gt;
* [[Ed]] ja [[Sed]]: tuki säännöllisille lausekkeille&lt;br /&gt;
* [[Vi]] ja [[vim]]: näiden graaffinen tila&lt;br /&gt;
* [[Emacs]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[[wikipedia:fi:säännöllinen lauseke|Säännöllinen lauseke]]&lt;br /&gt;
*[[wikipedia:fi:äärellinen automaatti|Äärellinen automaatti]]&lt;br /&gt;
*[[wikipedia:fi:pinoautomaatti|Pinoautomaatti]]&lt;br /&gt;
*[[wikipedia:fi:turingin kone|Turingin kone]]&lt;br /&gt;
*[http://www.ohjelmointiputka.net/opas.php?tunnus=phpsl Säännölliset lausekkeet PHP:ssä] -opas Ohjelmointiputkassa&lt;br /&gt;
*[http://swtch.com/~rsc/regexp/regexp1.html Regular Expression Matching Can Be Simple And Fast]: Keskustelua säännöllisten lausekkeiden toteutuksesta C-kielellä englanniksi.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30754</id>
		<title>Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30754"/>
		<updated>2010-02-17T00:32:24Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: /* Rivin alku ja loppu: ^ ja $ */ +&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Säännöllinen lauseke&#039;&#039;&#039; (engl. &#039;&#039;&#039;regular expression&#039;&#039;&#039;, &#039;&#039;&#039;regexp&#039;&#039;&#039;) on yksinkertainen merkkijonokieli, joka voi joko &#039;&#039;vastata&#039;&#039; tai &#039;&#039;olla vastaamatta&#039;&#039; jotain toista merkkijonoa.  Linux- ja Unix-järjestelmissä säännöllisiä lauskkeista on suurta hyötyä [[komentorivi]]ä käytettäessä, mm. komennoissa [[awk]] ja [[grep]]. Niiden voidaankin sanoa olevan [[putki]]ttamiseen yhdistettynä tärkeimpiä työkaluja, joita komentorivin edistynyt käyttö edellyttää.&lt;br /&gt;
&lt;br /&gt;
== Teoriaa ==&lt;br /&gt;
Tietojenkäsittelytieteessä puhutaan [[wikipedia:fi:säännöllinen kieli|säännöllisestä kielestä]], joka voidaan tunnistaa [[wikipedia:fi:äärellinen automaatti|äärellisellä automaatilla]]. Säännöllisiä lausekkeita käytetään myös monissa ohjelmointikielissä (mm. Perl, Java, Python, ECMAScript). Mille tahansa [[wikipedia:en:Turing complete|Turing-täydelliselle]] ohjelmointikielelle voidaan kuitenkin aina kirjoittaa säännöllisten lausekkeiden [[wikipedia:fi:Ohjelmointikielen tulkki|tulkki]].&lt;br /&gt;
&lt;br /&gt;
== Johdatus säännöllisiin lausekkeisiin ==&lt;br /&gt;
&lt;br /&gt;
===Perusteet===&lt;br /&gt;
Säännöllinen lauseke joko &#039;&#039;vastaa&#039;&#039; tai &#039;&#039;ei vastaa&#039;&#039; merkkijonoa. Kutsutaan säännöllistä lauseketta &#039;&#039;lausekkeeksi&#039;&#039; ja merkkijonoa, jonka vastaavuus lausekkeeseen halutaan selvittää, &#039;&#039;kohteeksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lausekkeen yksinkertaiset kirjoitusmerkit vastaavat yksi-yhteen kohteen kirjoitusmerkkejä. Tämän vuoksi lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa yllätyksettömästi kohdetta&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei kohdetta&lt;br /&gt;
 bono&lt;br /&gt;
&lt;br /&gt;
Yleensä (mm. grep ja awk) katsotaan, että kohteen alussa ja lopussa voi olla mielivaltainen määrä ei-vastaavia merkkejä. Tällöin kohde (s.o. näiden komentojen tapauksessa &#039;&#039;rivi&#039;&#039;) vastaa lauseketta, jos edes jokin sen &#039;&#039;osa&#039;&#039; vastaa lauseketta. Siis grep ja awk -yhteydessä lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa kohdetta&lt;br /&gt;
 bo&#039;&#039;&#039;abba&#039;&#039;&#039;bo&lt;br /&gt;
ja&lt;br /&gt;
 dada&#039;&#039;&#039;abba&#039;&#039;&#039;gada&lt;br /&gt;
mutta ei silti kohdetta&lt;br /&gt;
 b&#039;&#039;&#039;abb&#039;&#039;&#039;bab&lt;br /&gt;
&lt;br /&gt;
===Operaattorit===&lt;br /&gt;
Yksi-yhteen vastaavien kirjoitusmerkkien lisäksi säännöllisissä lausekkeissa on mahdollisuus käyttää erilaisia &#039;&#039;operaattorimerkkejä&#039;&#039;, joilla on lausekkeessa erikoismerkitys.&lt;br /&gt;
&lt;br /&gt;
====Vaihtoehtoisuusoperaattori: &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Näistä ensimmäinen on operaattori &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;, joka tarkoittaa &#039;&#039;vaihtelua&#039;&#039; tai &#039;&#039;alternointia&#039;&#039; (engl. alternation). Sen merkitys on sama kuin luonnollisen kielen sanalla &amp;quot;tai&amp;quot;. Lauseke&lt;br /&gt;
 omena|luumu&lt;br /&gt;
vastaa sekä kohteita&lt;br /&gt;
 &#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
että&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;&lt;br /&gt;
Kun lisäksi muistamme yltä, että komentorivityökalujen tapauksessa kohde voi sisältää ei-vastaavia merkkejä sekä alussa että lopussa, vastaa ylläoleva lauseke &amp;lt;tt&amp;gt;omena|luumu&amp;lt;/tt&amp;gt; myös merkkijonoja&lt;br /&gt;
 uuni&#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
tai&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;soppa&lt;br /&gt;
Huomaa kuitenkin, että seuraavassa kohteessa vain ensimmäinen esiintymä vastaa lauseketta&lt;br /&gt;
 kotimainen &#039;&#039;&#039;omena&#039;&#039;&#039;-luumuhillo&lt;br /&gt;
&lt;br /&gt;
====Toisto-operaattorit====&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja ilmaisulla &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; on säännöllisissä lausekkeissa erikoismerkitys, joka vaikuttaa niitä &#039;&#039;välittömästi edeltävään&#039;&#039; merkkiin.&lt;br /&gt;
&lt;br /&gt;
=====Mielivaltaisen monta: &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, tai ei kertaakaan&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab*a&lt;br /&gt;
vastaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Todettakooon, että selvästi b-merkkien määrä kohteessa voi olla mielivaltainen, joten eri vastaavia kohdemerkkijonoja on olemassa myös ääretön määrä.&lt;br /&gt;
&lt;br /&gt;
=====Vähintään yksi: &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, mutta vähintään kerran&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab+a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====Ehdollinen: &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen kerran, tai ei kertaakaan&#039;&#039;&amp;quot;. Siten lauseke&lt;br /&gt;
 ab?a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bbbbbbbbbbbbbbbba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;ba&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====n:stä m:n kertaan: &amp;lt;tt&amp;gt;{n, m}&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Aina yllä olevat operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; eivät riitä, vaan jotain merkkiä tarvitsee vastata juuri tietyn määrän toistoja. Voitaisiin toki kirjoittaa&lt;br /&gt;
 aaaa?a?&lt;br /&gt;
jos halutaan vastata&lt;br /&gt;
 aaa&lt;br /&gt;
 aaaa&lt;br /&gt;
 aaaaa&lt;br /&gt;
mutta voidaan kirjoittaa lyhyemmin&lt;br /&gt;
 a{3,5}&lt;br /&gt;
Tämä tarkoittaa, että edeltävää merkkiä &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; voi esiintyä kolmesta viiteen kertaan. Käytetään yleisesti tästä ilmaisusta mallia &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; ovat mielivaltaisia kokonaislukuja, tarkoittaen &#039;&#039;&amp;quot;n:stä m:n kertaan&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Kumpi tahansa numeroista &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; voidaan jättää pois. Täten ilmaisu&lt;br /&gt;
 {n}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;tasan n kertaa&amp;quot;&#039;. Ilmaisu&lt;br /&gt;
 {n,}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;vähintään n kertaa&amp;quot;&#039;&#039;. Ilmaisu&lt;br /&gt;
 {,m}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;korkeintaan m kertaa&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sivuhuomatuksena todettakoon, että yllä olevan perusteella lyhyemmät operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; voitaisiin aina korvata ilmaisuilla &amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{1,}&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt; vastaavasti.&lt;br /&gt;
&lt;br /&gt;
===== Huomautuksia =====&lt;br /&gt;
Operaattoreita voi yhdistää mielivaltaisesti toisiinsa. Siten lauseke&lt;br /&gt;
 hur+a*!*&lt;br /&gt;
vastaavaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;hur&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurra&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa!&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurrraaa!!!!&#039;&#039;&#039;&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Toisaalta lauseke &#039;&#039;ei vastaa&#039;&#039; mitään seuraavista kohteista:&lt;br /&gt;
 burraa!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;aa!!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;uuurraa!!&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;urrur!!&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Tässä vaiheessa on hyvä varmistaa, että ymmärtää edellä esitetyn esimerkin kokonaisuudessaan.&lt;br /&gt;
&lt;br /&gt;
===Sulut: &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Kysymys:&#039;&#039;&#039; Jos halutaan vastata kohdetta &amp;lt;tt&amp;gt;hUrrUrrUrr&amp;lt;/tt&amp;gt; siten, että merkkijono &amp;lt;tt&amp;gt;Urr&amp;lt;/tt&amp;gt; voi esiintyä kohteessa äärettömän monta kertaa, miten tulee toimia?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vastaus:&#039;&#039;&#039; Tämä on mahdotonta tähän mennessä esitetyillä operaattoreilla. Voisimme toki kirjoittaa &amp;lt;tt&amp;gt;hU+r+r+&amp;lt;/tt&amp;gt; tai vastaavaa, mutta tämä vastaisi vain kohteita kuten &amp;lt;tt&amp;gt;hUUrrrr&amp;lt;/tt&amp;gt;. Tarvitsemme selvästi uuden operaattorin; &#039;&#039;sulut&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; voidaan määrittää lausekkeen osia, jotka samaan tapaan kuin koulumatematiikassa lasketaan &#039;&#039;ennen&#039;&#039; laskun muita osia. Koska säännöllisissä lausekkeissa ei kuitenkaan lasketa mitään, havainnollistetaan sulkujen merkitystä esittämällä ratkaisu yllä olevaan kysymykseen. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 h(Urr)+&lt;br /&gt;
vastaa kohteita&lt;br /&gt;
 &#039;&#039;&#039;hUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
jne. jne. Lauseke ei vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Arr&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Err&lt;br /&gt;
 burr&lt;br /&gt;
&lt;br /&gt;
Samoin kohde &lt;br /&gt;
 &#039;&#039;&#039;hUr&#039;&#039;&#039;&lt;br /&gt;
näyttää oikealta, mutta jää kuitenkin liian lyhyeksi, sillä sulkujen sisältö on löydyttävä kohteesta aina &#039;&#039;kokonaan&#039;&#039;. Siksi kohde &amp;lt;tt&amp;gt;hUr&amp;lt;/tt&amp;gt; &amp;lt;u&amp;gt;ei&amp;lt;/u&amp;gt; vastaa lauseketta &amp;lt;tt&amp;gt;h(Urr)+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Esimerkkejä====&lt;br /&gt;
&lt;br /&gt;
Sulkuja voi yhdistellä mielivaltaisesti kaikkiin operaattoreihin &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;. Seuraavassa on annettu sarja lausekkeita, sekä esimerkkejä kutakin vastaavista ja vastaamattomista kohteista:&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 d(ii)?pada+(pa|ba)?&lt;br /&gt;
vastaa esimerkiksi seuraavia kohteita&lt;br /&gt;
 &#039;&#039;&#039;diipadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista&lt;br /&gt;
 &#039;&#039;&#039;di&#039;&#039;&#039;padaapa&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;uu&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Viimeinen esimerkki jää lyhyeksi, sillä merkki &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; on lausekkeessa pakollinen vähintään kerran.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (hi|ha|ho)+&lt;br /&gt;
vastaa mitä tahansa kohdetta, jossa esiintyy mikä tahansa määrä merkkijonoja &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ha&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;ho&amp;lt;/tt&amp;gt; peräkkäin mielivaltaisen monta kertaa, kuitenkin vähintään kerran. Lauseke vastaa siis kaikkia seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;haha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hiha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hoho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihaho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hahohihohahi&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;e&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;u&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;uhu&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;ehe&lt;br /&gt;
&lt;br /&gt;
===Yhtä merkkiä vastaavat erikoismerkit===&lt;br /&gt;
Säännöllisissä lausekkeissa voi esiintyä myös joitain erikoismerkkejä, jotka eivät ole operaattoreita, eli ne eivät vaikuta niitä edeltäviin sulkuihin tai merkkeihin. Ne voitaisiin aina kirjoittaa lausekkeilla muotoa&lt;br /&gt;
 (merkki1|merkki2|merkki3|merkki4|...|merkkiN)&lt;br /&gt;
mutta tämä on varsin työlästä ja epäselkeää. Siksi säännöllisissä lausekkeissa on joitain erikoismerkkejä, jotka ovat oikopolkuja monimutkaisten vaihtoehtoisuuslausekkeiden kirjoittamiseen.&lt;br /&gt;
&lt;br /&gt;
====Jokerimerkki: &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Merkillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; (piste) on erikoismerkitys. Se vastaa aina &#039;&#039;mitä tahansa&#039;&#039; merkkiä. Lauseke&lt;br /&gt;
 .*&lt;br /&gt;
vastaa siis kaikkia mahdollisia kohteita - jopa tyhjää merkkijonoa, sillä operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa, että erikoisoperaattori &amp;quot;mikä tahansa merkki&amp;quot; voi esiintyä myös nolla kertaa. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (h.)+&lt;br /&gt;
vastaa siten kaikkia seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;he&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hy&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihrhy&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 rh&lt;br /&gt;
 ah&lt;br /&gt;
 oh&lt;br /&gt;
 ih&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;&lt;br /&gt;
Viimeinen esimerkki jää jälleen lyhyeksi, sillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; ei vastaa kuitenkaan &amp;quot;tyhjää&amp;quot; merkkiä.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 .upu&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
mutta myös&lt;br /&gt;
 &#039;&#039;&#039;supu&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 sepe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Merkkiluokat: &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan korjata ylläoleva Ankanpoika-esimerkki, voitaisiin kirjoittaa:&lt;br /&gt;
 (t|h|l|T|H|L)upu&lt;br /&gt;
joka vastaisi vain ja ainoastaan:&lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Merkkien &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; avulla voidaan määritellä kirjainluokkia siten, että seuraava merkki kohteessa vastaa vain ja ainoastaan jotain hakasulkujen välissä olevaa kirjainta. Siten äskeistä täysin vastaa lauseke on&lt;br /&gt;
 [thlTHL]upu&lt;br /&gt;
&lt;br /&gt;
Hakasulkujen välissä voidaan myös määritellä aakkoston mukaisia välejä väliviivalla &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;. Tällöin &lt;br /&gt;
 19[4-9][0-9]|20[0-9][0-9]&lt;br /&gt;
vastaa kaikkia vuosilukuja välillä 1940-2099. Samoin &lt;br /&gt;
 Osasto [A-I]&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;Osasto A&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto B&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto C&#039;&#039;&#039;&lt;br /&gt;
 ...&lt;br /&gt;
 &#039;&#039;&#039;Osasto H&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto I&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;Osasto &#039;&#039;&#039;J&lt;br /&gt;
&lt;br /&gt;
Jos merkki &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; halutaan sisällyttää hakasulkuilmaisuun, se jätetään viimeiseksi. Esim.&lt;br /&gt;
 Ala[ -]aste&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;Ala aste&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Ala-aste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jos oikea hakasulku (&amp;lt;tt&amp;gt;]&amp;lt;/tt&amp;gt;) halutaan sisällyttää hakasulkuilmaukseen, se laitetaan hakasulkujen ensimmäiseksi merkiksi. Esim.&lt;br /&gt;
 []abcdef]+&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;b&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ab]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;d]f&#039;&#039;&#039;&lt;br /&gt;
jne., mutta ei&lt;br /&gt;
 [gi&lt;br /&gt;
 zo&lt;br /&gt;
&lt;br /&gt;
Hakasulkuilmaisusn merkitys voidaan kääntää asettamalla hattu &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; sen ensimmäiseksi merkiksi. Tällöin hakasulkuilmaisu vastaa mitä tahansa hakasuluissa &amp;lt;u&amp;gt;&#039;&#039;&#039;ei&#039;&#039;&#039;&amp;lt;/u&amp;gt; esiintyvää merkkiä kohteessa. Täten lauseke&lt;br /&gt;
 [^aeiouyåäö]+&lt;br /&gt;
vastaa mitä tahansa pelkistä konsonanteista, välimerkeistä ja numeroista koostuvaa kohdetta, kuten&lt;br /&gt;
 &#039;&#039;&#039;prrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;123&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hkr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;brr-hrr&#039;&#039;&#039;&lt;br /&gt;
jne. Mutta ei&lt;br /&gt;
 au&lt;br /&gt;
 aiai&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Grepin hyväksymissä säännöllisissä lausekkeissa merkin &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; voi sisällyttää hakasulkuilmaukseen laittamalla sen miksi tahansa muuksi merkiksi, kuin hakasulkujen ensimmäinen merkki. Tämä ei pidä välttämättä paikkaansa kuitenkaan kaikilla säännöllisten lausekkeiden toteutuksilla, vaan hattumerkin eteen on mahdollisesti laitettava pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Pako-operaattori: &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan vastata jotain merkkiä, joka on määritelty operaattoriksi säännöllisissä lausekkeissa, sitä ei voida kirjoittaa sellaisenaan lausekkeeseen. Jos halutaan vastata tarkalleen jotain seuraavista&lt;br /&gt;
 Mitä?&lt;br /&gt;
 Missä?&lt;br /&gt;
 Milloin?&lt;br /&gt;
ei voida kirjoittaa lauseketta&lt;br /&gt;
 (Mi(tä|ssä|lloin))?&lt;br /&gt;
koska kysymysmerkki &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; lopussa vain ehdollista koko ulomman sulkuilmaisun, ja koko lauseke vastaisi siis vain joko tyhjää merkkijonoa tai kysymysmerkitöntä kysymyssanaa.&lt;br /&gt;
&lt;br /&gt;
Tarvitaan pako-operaattoria &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Merkin &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tai ylipäänsä minkä tahansa opraattorimerkin erikoismerkityksen voi poistaa asettamalla sen eteen kenoviivan. Tällöin kenoviivaa välittömästi seuraava merkki täytyy esiintyä kohteessa sellaisenaan. Oikea tapa kirjoittaa yllä oleva lauseke olisi siten&lt;br /&gt;
 (Mi(tä|ssä|lloin))\?&lt;br /&gt;
Tämä vastaa vain ja ainoastaan haluttuja merkkijonoja.&lt;br /&gt;
&lt;br /&gt;
Seuraavat operaattorit on merkittävä pako-operaattorilla, jos niitä ei haluta tulkittavan erikoismerkeiksi:&lt;br /&gt;
 ( ) | * + ? { } [ ] ^ $ \&lt;br /&gt;
&lt;br /&gt;
Siis, jos halutaan vastata kohteessa kenoviivaa, on kirjoitettava &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;. Esimerkiksi Windows-polku:&lt;br /&gt;
 &#039;&#039;&amp;lt;asema&amp;gt;&#039;&#039;:\Dokumentit\&#039;&#039;&amp;lt;nimi&amp;gt;&#039;&#039;.(doc, docx tai odt)&lt;br /&gt;
voidaan löytää esim. seuraavalla säännöllisellä lausekkeella:&lt;br /&gt;
 [A-Z]:\\Dokumentit\\[a-öA-Ö0-9 _-]+\.(doc|docx|odt)&lt;br /&gt;
&lt;br /&gt;
=== Rivin alku ja loppu: &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;===&lt;br /&gt;
On voinut herätä kysymys, kuinka voidaan vastata kohdetta (s.o. riviä) &#039;&#039;tarkalleen&#039;&#039;. Heti alussa selvisi, että esim grepin mielestä kohde (rivi) vastaa lauseketta, jos lauseke esiintyy missä tahansa kohdassa riviä. Jos halutaan, että lauseke vastaa alusta loppuun tarkalleen koko riviä, on otettava käyttöön erikoismerkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;. Nämä vastaavat kohteessa rivin tai merkkijonon alkua ja loppua kuvaavia &amp;quot;näkymättömiä&amp;quot; merkkejä vastaavasti. Siten&lt;br /&gt;
 ^abba$&lt;br /&gt;
vastaa vain riviä&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei esimerkiksi&lt;br /&gt;
 babba&lt;br /&gt;
 abbab&lt;br /&gt;
 babbab&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;abb&#039;&#039;&#039;bba&lt;br /&gt;
 ^abba&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;$&lt;br /&gt;
 ^abba$&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki ====&lt;br /&gt;
&lt;br /&gt;
Merkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; antavat viimeisen silauksen grepin tehokkaaseen hyödyntämiseen. Nyt esimerkiksi, jos tulostetaan kaikki [[prosessi]]t komennolla &amp;lt;tt&amp;gt;[[ps]] -ef&amp;lt;/tt&amp;gt;, saadaan yleensä jokseenkin tälläinen listaus (esimerkissä palvelinkone):&lt;br /&gt;
 &lt;br /&gt;
 $ ps -ef&lt;br /&gt;
 UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
 root         1     0  0 Jan21 ?        00:00:34 init [2]      &lt;br /&gt;
 root      1425     1  0 Jan31 ?        00:00:00 /usr/sbin/xinetd&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
 root      5566     1  0 Jan21 ?        00:00:05 /usr/sbin/apache2 -k start&lt;br /&gt;
 root      6091     1  0 Jan21 ?        00:00:03 /usr/sbin/cron&lt;br /&gt;
 www-data 15379  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 www-data 15386  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 root     21684 32395  0 20:37 ?        00:00:00 sshd: user [priv]&lt;br /&gt;
 user     21688 21684  0 20:37 ?        00:00:00 sshd: user@pts/1&lt;br /&gt;
 user     21689 21688  0 20:37 pts/1    00:00:00 -bash&lt;br /&gt;
 user     21705 21689  0 20:37 pts/1    00:00:00 ps -ef&lt;br /&gt;
 syslog   32279     1  0 Jan21 ?        00:00:07 /sbin/syslogd -u syslog&lt;br /&gt;
 bind     32351     1  0 Jan31 ?        00:00:00 /usr/sbin/named&lt;br /&gt;
 root     32395     1  0 Jan21 ?        00:00:22 /usr/sbin/sshd&lt;br /&gt;
 (... jne ...)&lt;br /&gt;
&lt;br /&gt;
Jos haluamme ylläolevasta listasta vain &amp;quot;qmail&amp;quot; -alkuisten [[käyttäjä|käyttäjien]] prosessit, voisimme kirjoittaa&lt;br /&gt;
 ps -ef | grep qmail&lt;br /&gt;
Tämä kuitenkin tulostaa myös kaikki sellaiset prosessit, joiden nimikentässä esiintyy &amp;quot;qmail&amp;quot; – joukossa myös käyttäjän [[root]] prosesseja vastoin alkuperäistä tarkoitusta:&lt;br /&gt;
 $ ps -ef | grep qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger &#039;&#039;&#039;qmail&#039;&#039;&#039; 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-clean&lt;br /&gt;
&lt;br /&gt;
Ratkaisu qmail -alkuisten käyttäjien prosessien listaamiseen on:&lt;br /&gt;
 $ ps -ef | grep ^qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Hattumerkki &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; alussa vastaa jokaisen listausrivin alkua, jota pitää välittömästi seurata merkkijono &amp;lt;tt&amp;gt;qmail&amp;lt;/tt&amp;gt;, ja tämän jälkeen voi tulla mikä tahansa merkki (ilmaisu &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;). Grep tulostaa vain lausketta vastaavat rivit, ja tulos on haluttu.&lt;br /&gt;
&lt;br /&gt;
===== Pako komentotulkista =====&lt;br /&gt;
Jos halutaan antaa jokin monimutkaisempi ilmaisu, on hyvä asettaa säännöllinen lauseke yksinkertaisten heittomerkkien &amp;lt;tt&amp;gt;&#039;&amp;lt;/tt&amp;gt; sisään, jotta ne regexp-operaattorit, joillla on jokin erikoismerkitys [[komentotulkki|komeotulkissa]] eivät aiheuta ongelmia.&lt;br /&gt;
 $ echo moi | egrep m(o|a)i&lt;br /&gt;
 -bash: syntax error near unexpected token `(&#039;&lt;br /&gt;
Sululla &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; on erikoismerkitys komentotulkissa, samoin merkillä &amp;lt;tt&amp;gt;[[putki||]]&amp;lt;/tt&amp;gt;. Ratkaisu:&lt;br /&gt;
 $ echo moi | egrep &#039;m(o|a)i&#039;&lt;br /&gt;
 moi&lt;br /&gt;
Esimerkissä käytettiin komentoa egrep. Se on oikopolku grepin [[valitsin|valitsimelle]] &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;, joka ottaa säännöllisten lausekkeiden laajennetun tuen käyttöön. Normaalissa käytössä (pelkkö komento &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) operaattorit &amp;lt;tt&amp;gt;? + {} | (&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; eivät ole käytettävissä, paitsi asettamalla niiden eteen pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Jos ylläolevassa prosessilistausesimerkissä halutaan tulostaa pelkät prosessien [[PID]]-numerot, voidaan käyttää [[awk]]-työkalua seuraavasti:&lt;br /&gt;
 $ ps -ef | awk &#039;/^qmail/ { print $2 }&#039;&lt;br /&gt;
 3986&lt;br /&gt;
 3990&lt;br /&gt;
 3994&lt;br /&gt;
 3995&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä lausekkeista ==&lt;br /&gt;
Web-kuva:&lt;br /&gt;
 [^ ]+\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)&lt;br /&gt;
Päivämäärä muotoa pp.kk.vvvv:&lt;br /&gt;
 [0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}&lt;br /&gt;
2-merkkinen [[wikipedia:fi:heksadesimaalijärjestelmä|heksadesimaali]]:&lt;br /&gt;
 [0-9A-Fa-f]{2}&lt;br /&gt;
Sähköpostiosoite:&lt;br /&gt;
 [a-zA-Z0-9_]+@[a-zA-Z0-9_\.]+\.[a-zA-Z]{2,3}&lt;br /&gt;
&lt;br /&gt;
== Laajennukset ==&lt;br /&gt;
Yllä esitetty on hyvä lähtökohta säännöllisiin lausekkeisiin, ja kaikki modernit [[POSIX]]-yhteensopivat toteutukset tukevat mainittuja operaattoreita ja erikoismerkkejä. Monissa ohjelmointikielissä on tehty laajennuksia tähän, mutta esim. [[grep]] ei tue seuraavia. &lt;br /&gt;
&lt;br /&gt;
=== Pakoluokat ===&lt;br /&gt;
Jos halutaan kirjoittaa lause, joka jossain kohtaa vastaa mitä tahansa numeromerkkiä, voidaan kirjoittaa hakasulkuilmaus &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;. Tälläisille yleisesti käytetyille luokille on kuitenkin olemassa laajennuksissa helpompia nimiä. Kutsutaan näitä &#039;&#039;pakoluokiksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style: solid; border-collapse: collapse&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+&#039;&#039;&#039;Pakoluokat&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Ilmaisu !! Merkitys !! Vastaava hakasulkuilmaus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; || Mikä tahansa aakkonen a-z, numero tai alaviiva &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt;. || &amp;lt;tt&amp;gt;[a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\W&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa muu kuin aakkonen a-z, numero tai alaviiva. || &amp;lt;tt&amp;gt;[^a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; || Mikä tahansa tyhjä merkki (esim. välilyönti tai tabulaattori) || esim. &amp;lt;tt&amp;gt;[ \t]&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; tabulaattorimerkki&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-tyhjä merkki || esim. &amp;lt;tt&amp;gt;[^ \t]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; || Mikä tahansa numero. || &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\D&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-numero. || &amp;lt;tt&amp;gt;[^0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 \d+&lt;br /&gt;
vastaa siis kaikkia numeroita aivan siinä missä myös&lt;br /&gt;
 [0-9]+&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Grep]] ja [[Awk]]&lt;br /&gt;
** [[Putki]]&lt;br /&gt;
* [[Ed]] ja [[Sed]]: tuki säännöllisille lausekkeille&lt;br /&gt;
* [[Vi]] ja [[vim]]: näiden graaffinen tila&lt;br /&gt;
* [[Emacs]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[[wikipedia:fi:säännöllinen lauseke|Säännöllinen lauseke]]&lt;br /&gt;
*[[wikipedia:fi:äärellinen automaatti|Äärellinen automaatti]]&lt;br /&gt;
*[[wikipedia:fi:pinoautomaatti|Pinoautomaatti]]&lt;br /&gt;
*[[wikipedia:fi:turingin kone|Turingin kone]]&lt;br /&gt;
*[http://www.ohjelmointiputka.net/opas.php?tunnus=phpsl Säännölliset lausekkeet PHP:ssä] -opas Ohjelmointiputkassa&lt;br /&gt;
*[http://swtch.com/~rsc/regexp/regexp1.html Regular Expression Matching Can Be Simple And Fast]: Keskustelua säännöllisten lausekkeiden toteutuksesta C-kielellä englanniksi.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30753</id>
		<title>Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30753"/>
		<updated>2010-02-17T00:27:07Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: /* Pakoluokat */ fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Säännöllinen lauseke&#039;&#039;&#039; (engl. &#039;&#039;&#039;regular expression&#039;&#039;&#039;, &#039;&#039;&#039;regexp&#039;&#039;&#039;) on yksinkertainen merkkijonokieli, joka voi joko &#039;&#039;vastata&#039;&#039; tai &#039;&#039;olla vastaamatta&#039;&#039; jotain toista merkkijonoa.  Linux- ja Unix-järjestelmissä säännöllisiä lauskkeista on suurta hyötyä [[komentorivi]]ä käytettäessä, mm. komennoissa [[awk]] ja [[grep]]. Niiden voidaankin sanoa olevan [[putki]]ttamiseen yhdistettynä tärkeimpiä työkaluja, joita komentorivin edistynyt käyttö edellyttää.&lt;br /&gt;
&lt;br /&gt;
== Teoriaa ==&lt;br /&gt;
Tietojenkäsittelytieteessä puhutaan [[wikipedia:fi:säännöllinen kieli|säännöllisestä kielestä]], joka voidaan tunnistaa [[wikipedia:fi:äärellinen automaatti|äärellisellä automaatilla]]. Säännöllisiä lausekkeita käytetään myös monissa ohjelmointikielissä (mm. Perl, Java, Python, ECMAScript). Mille tahansa [[wikipedia:en:Turing complete|Turing-täydelliselle]] ohjelmointikielelle voidaan kuitenkin aina kirjoittaa säännöllisten lausekkeiden [[wikipedia:fi:Ohjelmointikielen tulkki|tulkki]].&lt;br /&gt;
&lt;br /&gt;
== Johdatus säännöllisiin lausekkeisiin ==&lt;br /&gt;
&lt;br /&gt;
===Perusteet===&lt;br /&gt;
Säännöllinen lauseke joko &#039;&#039;vastaa&#039;&#039; tai &#039;&#039;ei vastaa&#039;&#039; merkkijonoa. Kutsutaan säännöllistä lauseketta &#039;&#039;lausekkeeksi&#039;&#039; ja merkkijonoa, jonka vastaavuus lausekkeeseen halutaan selvittää, &#039;&#039;kohteeksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lausekkeen yksinkertaiset kirjoitusmerkit vastaavat yksi-yhteen kohteen kirjoitusmerkkejä. Tämän vuoksi lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa yllätyksettömästi kohdetta&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei kohdetta&lt;br /&gt;
 bono&lt;br /&gt;
&lt;br /&gt;
Yleensä (mm. grep ja awk) katsotaan, että kohteen alussa ja lopussa voi olla mielivaltainen määrä ei-vastaavia merkkejä. Tällöin kohde (s.o. näiden komentojen tapauksessa &#039;&#039;rivi&#039;&#039;) vastaa lauseketta, jos edes jokin sen &#039;&#039;osa&#039;&#039; vastaa lauseketta. Siis grep ja awk -yhteydessä lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa kohdetta&lt;br /&gt;
 bo&#039;&#039;&#039;abba&#039;&#039;&#039;bo&lt;br /&gt;
ja&lt;br /&gt;
 dada&#039;&#039;&#039;abba&#039;&#039;&#039;gada&lt;br /&gt;
mutta ei silti kohdetta&lt;br /&gt;
 b&#039;&#039;&#039;abb&#039;&#039;&#039;bab&lt;br /&gt;
&lt;br /&gt;
===Operaattorit===&lt;br /&gt;
Yksi-yhteen vastaavien kirjoitusmerkkien lisäksi säännöllisissä lausekkeissa on mahdollisuus käyttää erilaisia &#039;&#039;operaattorimerkkejä&#039;&#039;, joilla on lausekkeessa erikoismerkitys.&lt;br /&gt;
&lt;br /&gt;
====Vaihtoehtoisuusoperaattori: &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Näistä ensimmäinen on operaattori &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;, joka tarkoittaa &#039;&#039;vaihtelua&#039;&#039; tai &#039;&#039;alternointia&#039;&#039; (engl. alternation). Sen merkitys on sama kuin luonnollisen kielen sanalla &amp;quot;tai&amp;quot;. Lauseke&lt;br /&gt;
 omena|luumu&lt;br /&gt;
vastaa sekä kohteita&lt;br /&gt;
 &#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
että&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;&lt;br /&gt;
Kun lisäksi muistamme yltä, että komentorivityökalujen tapauksessa kohde voi sisältää ei-vastaavia merkkejä sekä alussa että lopussa, vastaa ylläoleva lauseke &amp;lt;tt&amp;gt;omena|luumu&amp;lt;/tt&amp;gt; myös merkkijonoja&lt;br /&gt;
 uuni&#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
tai&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;soppa&lt;br /&gt;
Huomaa kuitenkin, että seuraavassa kohteessa vain ensimmäinen esiintymä vastaa lauseketta&lt;br /&gt;
 kotimainen &#039;&#039;&#039;omena&#039;&#039;&#039;-luumuhillo&lt;br /&gt;
&lt;br /&gt;
====Toisto-operaattorit====&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja ilmaisulla &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; on säännöllisissä lausekkeissa erikoismerkitys, joka vaikuttaa niitä &#039;&#039;välittömästi edeltävään&#039;&#039; merkkiin.&lt;br /&gt;
&lt;br /&gt;
=====Mielivaltaisen monta: &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, tai ei kertaakaan&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab*a&lt;br /&gt;
vastaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Todettakooon, että selvästi b-merkkien määrä kohteessa voi olla mielivaltainen, joten eri vastaavia kohdemerkkijonoja on olemassa myös ääretön määrä.&lt;br /&gt;
&lt;br /&gt;
=====Vähintään yksi: &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, mutta vähintään kerran&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab+a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====Ehdollinen: &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen kerran, tai ei kertaakaan&#039;&#039;&amp;quot;. Siten lauseke&lt;br /&gt;
 ab?a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bbbbbbbbbbbbbbbba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;ba&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====n:stä m:n kertaan: &amp;lt;tt&amp;gt;{n, m}&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Aina yllä olevat operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; eivät riitä, vaan jotain merkkiä tarvitsee vastata juuri tietyn määrän toistoja. Voitaisiin toki kirjoittaa&lt;br /&gt;
 aaaa?a?&lt;br /&gt;
jos halutaan vastata&lt;br /&gt;
 aaa&lt;br /&gt;
 aaaa&lt;br /&gt;
 aaaaa&lt;br /&gt;
mutta voidaan kirjoittaa lyhyemmin&lt;br /&gt;
 a{3,5}&lt;br /&gt;
Tämä tarkoittaa, että edeltävää merkkiä &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; voi esiintyä kolmesta viiteen kertaan. Käytetään yleisesti tästä ilmaisusta mallia &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; ovat mielivaltaisia kokonaislukuja, tarkoittaen &#039;&#039;&amp;quot;n:stä m:n kertaan&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Kumpi tahansa numeroista &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; voidaan jättää pois. Täten ilmaisu&lt;br /&gt;
 {n}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;tasan n kertaa&amp;quot;&#039;. Ilmaisu&lt;br /&gt;
 {n,}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;vähintään n kertaa&amp;quot;&#039;&#039;. Ilmaisu&lt;br /&gt;
 {,m}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;korkeintaan m kertaa&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sivuhuomatuksena todettakoon, että yllä olevan perusteella lyhyemmät operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; voitaisiin aina korvata ilmaisuilla &amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{1,}&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt; vastaavasti.&lt;br /&gt;
&lt;br /&gt;
===== Huomautuksia =====&lt;br /&gt;
Operaattoreita voi yhdistää mielivaltaisesti toisiinsa. Siten lauseke&lt;br /&gt;
 hur+a*!*&lt;br /&gt;
vastaavaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;hur&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurra&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa!&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurrraaa!!!!&#039;&#039;&#039;&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Toisaalta lauseke &#039;&#039;ei vastaa&#039;&#039; mitään seuraavista kohteista:&lt;br /&gt;
 burraa!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;aa!!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;uuurraa!!&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;urrur!!&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Tässä vaiheessa on hyvä varmistaa, että ymmärtää edellä esitetyn esimerkin kokonaisuudessaan.&lt;br /&gt;
&lt;br /&gt;
===Sulut: &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Kysymys:&#039;&#039;&#039; Jos halutaan vastata kohdetta &amp;lt;tt&amp;gt;hUrrUrrUrr&amp;lt;/tt&amp;gt; siten, että merkkijono &amp;lt;tt&amp;gt;Urr&amp;lt;/tt&amp;gt; voi esiintyä kohteessa äärettömän monta kertaa, miten tulee toimia?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vastaus:&#039;&#039;&#039; Tämä on mahdotonta tähän mennessä esitetyillä operaattoreilla. Voisimme toki kirjoittaa &amp;lt;tt&amp;gt;hU+r+r+&amp;lt;/tt&amp;gt; tai vastaavaa, mutta tämä vastaisi vain kohteita kuten &amp;lt;tt&amp;gt;hUUrrrr&amp;lt;/tt&amp;gt;. Tarvitsemme selvästi uuden operaattorin; &#039;&#039;sulut&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; voidaan määrittää lausekkeen osia, jotka samaan tapaan kuin koulumatematiikassa lasketaan &#039;&#039;ennen&#039;&#039; laskun muita osia. Koska säännöllisissä lausekkeissa ei kuitenkaan lasketa mitään, havainnollistetaan sulkujen merkitystä esittämällä ratkaisu yllä olevaan kysymykseen. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 h(Urr)+&lt;br /&gt;
vastaa kohteita&lt;br /&gt;
 &#039;&#039;&#039;hUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
jne. jne. Lauseke ei vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Arr&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Err&lt;br /&gt;
 burr&lt;br /&gt;
&lt;br /&gt;
Samoin kohde &lt;br /&gt;
 &#039;&#039;&#039;hUr&#039;&#039;&#039;&lt;br /&gt;
näyttää oikealta, mutta jää kuitenkin liian lyhyeksi, sillä sulkujen sisältö on löydyttävä kohteesta aina &#039;&#039;kokonaan&#039;&#039;. Siksi kohde &amp;lt;tt&amp;gt;hUr&amp;lt;/tt&amp;gt; &amp;lt;u&amp;gt;ei&amp;lt;/u&amp;gt; vastaa lauseketta &amp;lt;tt&amp;gt;h(Urr)+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Esimerkkejä====&lt;br /&gt;
&lt;br /&gt;
Sulkuja voi yhdistellä mielivaltaisesti kaikkiin operaattoreihin &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;. Seuraavassa on annettu sarja lausekkeita, sekä esimerkkejä kutakin vastaavista ja vastaamattomista kohteista:&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 d(ii)?pada+(pa|ba)?&lt;br /&gt;
vastaa esimerkiksi seuraavia kohteita&lt;br /&gt;
 &#039;&#039;&#039;diipadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista&lt;br /&gt;
 &#039;&#039;&#039;di&#039;&#039;&#039;padaapa&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;uu&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Viimeinen esimerkki jää lyhyeksi, sillä merkki &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; on lausekkeessa pakollinen vähintään kerran.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (hi|ha|ho)+&lt;br /&gt;
vastaa mitä tahansa kohdetta, jossa esiintyy mikä tahansa määrä merkkijonoja &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ha&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;ho&amp;lt;/tt&amp;gt; peräkkäin mielivaltaisen monta kertaa, kuitenkin vähintään kerran. Lauseke vastaa siis kaikkia seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;haha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hiha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hoho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihaho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hahohihohahi&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;e&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;u&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;uhu&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;ehe&lt;br /&gt;
&lt;br /&gt;
===Yhtä merkkiä vastaavat erikoismerkit===&lt;br /&gt;
Säännöllisissä lausekkeissa voi esiintyä myös joitain erikoismerkkejä, jotka eivät ole operaattoreita, eli ne eivät vaikuta niitä edeltäviin sulkuihin tai merkkeihin. Ne voitaisiin aina kirjoittaa lausekkeilla muotoa&lt;br /&gt;
 (merkki1|merkki2|merkki3|merkki4|...|merkkiN)&lt;br /&gt;
mutta tämä on varsin työlästä ja epäselkeää. Siksi säännöllisissä lausekkeissa on joitain erikoismerkkejä, jotka ovat oikopolkuja monimutkaisten vaihtoehtoisuuslausekkeiden kirjoittamiseen.&lt;br /&gt;
&lt;br /&gt;
====Jokerimerkki: &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Merkillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; (piste) on erikoismerkitys. Se vastaa aina &#039;&#039;mitä tahansa&#039;&#039; merkkiä. Lauseke&lt;br /&gt;
 .*&lt;br /&gt;
vastaa siis kaikkia mahdollisia kohteita - jopa tyhjää merkkijonoa, sillä operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa, että erikoisoperaattori &amp;quot;mikä tahansa merkki&amp;quot; voi esiintyä myös nolla kertaa. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (h.)+&lt;br /&gt;
vastaa siten kaikkia seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;he&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hy&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihrhy&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 rh&lt;br /&gt;
 ah&lt;br /&gt;
 oh&lt;br /&gt;
 ih&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;&lt;br /&gt;
Viimeinen esimerkki jää jälleen lyhyeksi, sillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; ei vastaa kuitenkaan &amp;quot;tyhjää&amp;quot; merkkiä.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 .upu&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
mutta myös&lt;br /&gt;
 &#039;&#039;&#039;supu&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 sepe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Merkkiluokat: &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan korjata ylläoleva Ankanpoika-esimerkki, voitaisiin kirjoittaa:&lt;br /&gt;
 (t|h|l|T|H|L)upu&lt;br /&gt;
joka vastaisi vain ja ainoastaan:&lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Merkkien &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; avulla voidaan määritellä kirjainluokkia siten, että seuraava merkki kohteessa vastaa vain ja ainoastaan jotain hakasulkujen välissä olevaa kirjainta. Siten äskeistä täysin vastaa lauseke on&lt;br /&gt;
 [thlTHL]upu&lt;br /&gt;
&lt;br /&gt;
Hakasulkujen välissä voidaan myös määritellä aakkoston mukaisia välejä väliviivalla &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;. Tällöin &lt;br /&gt;
 19[4-9][0-9]|20[0-9][0-9]&lt;br /&gt;
vastaa kaikkia vuosilukuja välillä 1940-2099. Samoin &lt;br /&gt;
 Osasto [A-I]&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;Osasto A&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto B&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto C&#039;&#039;&#039;&lt;br /&gt;
 ...&lt;br /&gt;
 &#039;&#039;&#039;Osasto H&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto I&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;Osasto &#039;&#039;&#039;J&lt;br /&gt;
&lt;br /&gt;
Jos merkki &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; halutaan sisällyttää hakasulkuilmaisuun, se jätetään viimeiseksi. Esim.&lt;br /&gt;
 Ala[ -]aste&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;Ala aste&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Ala-aste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jos oikea hakasulku (&amp;lt;tt&amp;gt;]&amp;lt;/tt&amp;gt;) halutaan sisällyttää hakasulkuilmaukseen, se laitetaan hakasulkujen ensimmäiseksi merkiksi. Esim.&lt;br /&gt;
 []abcdef]+&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;b&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ab]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;d]f&#039;&#039;&#039;&lt;br /&gt;
jne., mutta ei&lt;br /&gt;
 [gi&lt;br /&gt;
 zo&lt;br /&gt;
&lt;br /&gt;
Hakasulkuilmaisusn merkitys voidaan kääntää asettamalla hattu &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; sen ensimmäiseksi merkiksi. Tällöin hakasulkuilmaisu vastaa mitä tahansa hakasuluissa &amp;lt;u&amp;gt;&#039;&#039;&#039;ei&#039;&#039;&#039;&amp;lt;/u&amp;gt; esiintyvää merkkiä kohteessa. Täten lauseke&lt;br /&gt;
 [^aeiouyåäö]+&lt;br /&gt;
vastaa mitä tahansa pelkistä konsonanteista, välimerkeistä ja numeroista koostuvaa kohdetta, kuten&lt;br /&gt;
 &#039;&#039;&#039;prrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;123&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hkr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;brr-hrr&#039;&#039;&#039;&lt;br /&gt;
jne. Mutta ei&lt;br /&gt;
 au&lt;br /&gt;
 aiai&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Grepin hyväksymissä säännöllisissä lausekkeissa merkin &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; voi sisällyttää hakasulkuilmaukseen laittamalla sen miksi tahansa muuksi merkiksi, kuin hakasulkujen ensimmäinen merkki. Tämä ei pidä välttämättä paikkaansa kuitenkaan kaikilla säännöllisten lausekkeiden toteutuksilla, vaan hattumerkin eteen on mahdollisesti laitettava pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Pako-operaattori: &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan vastata jotain merkkiä, joka on määritelty operaattoriksi säännöllisissä lausekkeissa, sitä ei voida kirjoittaa sellaisenaan lausekkeeseen. Jos halutaan vastata tarkalleen jotain seuraavista&lt;br /&gt;
 Mitä?&lt;br /&gt;
 Missä?&lt;br /&gt;
 Milloin?&lt;br /&gt;
ei voida kirjoittaa lauseketta&lt;br /&gt;
 (Mi(tä|ssä|lloin))?&lt;br /&gt;
koska kysymysmerkki &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; lopussa vain ehdollista koko ulomman sulkuilmaisun, ja koko lauseke vastaisi siis vain joko tyhjää merkkijonoa tai kysymysmerkitöntä kysymyssanaa.&lt;br /&gt;
&lt;br /&gt;
Tarvitaan pako-operaattoria &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Merkin &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tai ylipäänsä minkä tahansa opraattorimerkin erikoismerkityksen voi poistaa asettamalla sen eteen kenoviivan. Tällöin kenoviivaa välittömästi seuraava merkki täytyy esiintyä kohteessa sellaisenaan. Oikea tapa kirjoittaa yllä oleva lauseke olisi siten&lt;br /&gt;
 (Mi(tä|ssä|lloin))\?&lt;br /&gt;
Tämä vastaa vain ja ainoastaan haluttuja merkkijonoja.&lt;br /&gt;
&lt;br /&gt;
Seuraavat operaattorit on merkittävä pako-operaattorilla, jos niitä ei haluta tulkittavan erikoismerkeiksi:&lt;br /&gt;
 ( ) | * + ? { } [ ] ^ $ \&lt;br /&gt;
&lt;br /&gt;
Siis, jos halutaan vastata kohteessa kenoviivaa, on kirjoitettava &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;. Esimerkiksi Windows-polku:&lt;br /&gt;
 &#039;&#039;&amp;lt;asema&amp;gt;&#039;&#039;:\Dokumentit\&#039;&#039;&amp;lt;nimi&amp;gt;&#039;&#039;.(doc, docx tai odt)&lt;br /&gt;
voidaan löytää esim. seuraavalla säännöllisellä lausekkeella:&lt;br /&gt;
 [A-Z]:\\Dokumentit\\[a-öA-Ö0-9 _-]+\.(doc|docx|odt)&lt;br /&gt;
&lt;br /&gt;
=== Rivin alku ja loppu: &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;===&lt;br /&gt;
On voinut herätä kysymys, kuinka voidaan vastata kohdetta (s.o. riviä) &#039;&#039;tarkalleen&#039;&#039;. Heti alussa selvisi, että esim grepin mielestä kohde (rivi) vastaa lauseketta, jos lauseke esiintyy missä tahansa kohdassa riviä. Jos halutaan, että lauseke vastaa alusta loppuun tarkalleen koko riviä, on otettava käyttöön erikoismerkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;. Nämä vastaavat kohteessa rivin tai merkkijonon alkua ja loppua kuvaavia &amp;quot;näkymättömiä&amp;quot; merkkejä vastaavasti. Siten&lt;br /&gt;
 ^abba$&lt;br /&gt;
vastaa vain riviä&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei esimerkiksi&lt;br /&gt;
 babba&lt;br /&gt;
 abbab&lt;br /&gt;
 babbab&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;abb&#039;&#039;&#039;bba&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki ====&lt;br /&gt;
&lt;br /&gt;
Merkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; antavat viimeisen silauksen grepin tehokkaaseen hyödyntämiseen. Nyt esimerkiksi, jos tulostetaan kaikki [[prosessi]]t komennolla &amp;lt;tt&amp;gt;[[ps]] -ef&amp;lt;/tt&amp;gt;, saadaan yleensä jokseenkin tälläinen listaus (esimerkissä palvelinkone):&lt;br /&gt;
 &lt;br /&gt;
 $ ps -ef&lt;br /&gt;
 UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
 root         1     0  0 Jan21 ?        00:00:34 init [2]      &lt;br /&gt;
 root      1425     1  0 Jan31 ?        00:00:00 /usr/sbin/xinetd&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
 root      5566     1  0 Jan21 ?        00:00:05 /usr/sbin/apache2 -k start&lt;br /&gt;
 root      6091     1  0 Jan21 ?        00:00:03 /usr/sbin/cron&lt;br /&gt;
 www-data 15379  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 www-data 15386  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 root     21684 32395  0 20:37 ?        00:00:00 sshd: user [priv]&lt;br /&gt;
 user     21688 21684  0 20:37 ?        00:00:00 sshd: user@pts/1&lt;br /&gt;
 user     21689 21688  0 20:37 pts/1    00:00:00 -bash&lt;br /&gt;
 user     21705 21689  0 20:37 pts/1    00:00:00 ps -ef&lt;br /&gt;
 syslog   32279     1  0 Jan21 ?        00:00:07 /sbin/syslogd -u syslog&lt;br /&gt;
 bind     32351     1  0 Jan31 ?        00:00:00 /usr/sbin/named&lt;br /&gt;
 root     32395     1  0 Jan21 ?        00:00:22 /usr/sbin/sshd&lt;br /&gt;
 (... jne ...)&lt;br /&gt;
&lt;br /&gt;
Jos haluamme ylläolevasta listasta vain &amp;quot;qmail&amp;quot; -alkuisten [[käyttäjä|käyttäjien]] prosessit, voisimme kirjoittaa&lt;br /&gt;
 ps -ef | grep qmail&lt;br /&gt;
Tämä kuitenkin tulostaa myös kaikki sellaiset prosessit, joiden nimikentässä esiintyy &amp;quot;qmail&amp;quot; – joukossa myös käyttäjän [[root]] prosesseja vastoin alkuperäistä tarkoitusta:&lt;br /&gt;
 $ ps -ef | grep qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger &#039;&#039;&#039;qmail&#039;&#039;&#039; 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-clean&lt;br /&gt;
&lt;br /&gt;
Ratkaisu qmail -alkuisten käyttäjien prosessien listaamiseen on:&lt;br /&gt;
 $ ps -ef | grep ^qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Hattumerkki &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; alussa vastaa jokaisen listausrivin alkua, jota pitää välittömästi seurata merkkijono &amp;lt;tt&amp;gt;qmail&amp;lt;/tt&amp;gt;, ja tämän jälkeen voi tulla mikä tahansa merkki (ilmaisu &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;). Grep tulostaa vain lausketta vastaavat rivit, ja tulos on haluttu.&lt;br /&gt;
&lt;br /&gt;
===== Pako komentotulkista =====&lt;br /&gt;
Jos halutaan antaa jokin monimutkaisempi ilmaisu, on hyvä asettaa säännöllinen lauseke yksinkertaisten heittomerkkien &amp;lt;tt&amp;gt;&#039;&amp;lt;/tt&amp;gt; sisään, jotta ne regexp-operaattorit, joillla on jokin erikoismerkitys [[komentotulkki|komeotulkissa]] eivät aiheuta ongelmia.&lt;br /&gt;
 $ echo moi | egrep m(o|a)i&lt;br /&gt;
 -bash: syntax error near unexpected token `(&#039;&lt;br /&gt;
Sululla &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; on erikoismerkitys komentotulkissa, samoin merkillä &amp;lt;tt&amp;gt;[[putki||]]&amp;lt;/tt&amp;gt;. Ratkaisu:&lt;br /&gt;
 $ echo moi | egrep &#039;m(o|a)i&#039;&lt;br /&gt;
 moi&lt;br /&gt;
Esimerkissä käytettiin komentoa egrep. Se on oikopolku grepin [[valitsin|valitsimelle]] &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;, joka ottaa säännöllisten lausekkeiden laajennetun tuen käyttöön. Normaalissa käytössä (pelkkö komento &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) operaattorit &amp;lt;tt&amp;gt;? + {} | (&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; eivät ole käytettävissä, paitsi asettamalla niiden eteen pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Jos ylläolevassa prosessilistausesimerkissä halutaan tulostaa pelkät prosessien [[PID]]-numerot, voidaan käyttää [[awk]]-työkalua seuraavasti:&lt;br /&gt;
 $ ps -ef | awk &#039;/^qmail/ { print $2 }&#039;&lt;br /&gt;
 3986&lt;br /&gt;
 3990&lt;br /&gt;
 3994&lt;br /&gt;
 3995&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä lausekkeista ==&lt;br /&gt;
Web-kuva:&lt;br /&gt;
 [^ ]+\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)&lt;br /&gt;
Päivämäärä muotoa pp.kk.vvvv:&lt;br /&gt;
 [0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}&lt;br /&gt;
2-merkkinen [[wikipedia:fi:heksadesimaalijärjestelmä|heksadesimaali]]:&lt;br /&gt;
 [0-9A-Fa-f]{2}&lt;br /&gt;
Sähköpostiosoite:&lt;br /&gt;
 [a-zA-Z0-9_]+@[a-zA-Z0-9_\.]+\.[a-zA-Z]{2,3}&lt;br /&gt;
&lt;br /&gt;
== Laajennukset ==&lt;br /&gt;
Yllä esitetty on hyvä lähtökohta säännöllisiin lausekkeisiin, ja kaikki modernit [[POSIX]]-yhteensopivat toteutukset tukevat mainittuja operaattoreita ja erikoismerkkejä. Monissa ohjelmointikielissä on tehty laajennuksia tähän, mutta esim. [[grep]] ei tue seuraavia. &lt;br /&gt;
&lt;br /&gt;
=== Pakoluokat ===&lt;br /&gt;
Jos halutaan kirjoittaa lause, joka jossain kohtaa vastaa mitä tahansa numeromerkkiä, voidaan kirjoittaa hakasulkuilmaus &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;. Tälläisille yleisesti käytetyille luokille on kuitenkin olemassa laajennuksissa helpompia nimiä. Kutsutaan näitä &#039;&#039;pakoluokiksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style: solid; border-collapse: collapse&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+&#039;&#039;&#039;Pakoluokat&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Ilmaisu !! Merkitys !! Vastaava hakasulkuilmaus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; || Mikä tahansa aakkonen a-z, numero tai alaviiva &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt;. || &amp;lt;tt&amp;gt;[a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\W&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa muu kuin aakkonen a-z, numero tai alaviiva. || &amp;lt;tt&amp;gt;[^a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; || Mikä tahansa tyhjä merkki (esim. välilyönti tai tabulaattori) || esim. &amp;lt;tt&amp;gt;[ \t]&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; tabulaattorimerkki&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-tyhjä merkki || esim. &amp;lt;tt&amp;gt;[^ \t]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; || Mikä tahansa numero. || &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\D&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-numero. || &amp;lt;tt&amp;gt;[^0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 \d+&lt;br /&gt;
vastaa siis kaikkia numeroita aivan siinä missä myös&lt;br /&gt;
 [0-9]+&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Grep]] ja [[Awk]]&lt;br /&gt;
** [[Putki]]&lt;br /&gt;
* [[Ed]] ja [[Sed]]: tuki säännöllisille lausekkeille&lt;br /&gt;
* [[Vi]] ja [[vim]]: näiden graaffinen tila&lt;br /&gt;
* [[Emacs]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[[wikipedia:fi:säännöllinen lauseke|Säännöllinen lauseke]]&lt;br /&gt;
*[[wikipedia:fi:äärellinen automaatti|Äärellinen automaatti]]&lt;br /&gt;
*[[wikipedia:fi:pinoautomaatti|Pinoautomaatti]]&lt;br /&gt;
*[[wikipedia:fi:turingin kone|Turingin kone]]&lt;br /&gt;
*[http://www.ohjelmointiputka.net/opas.php?tunnus=phpsl Säännölliset lausekkeet PHP:ssä] -opas Ohjelmointiputkassa&lt;br /&gt;
*[http://swtch.com/~rsc/regexp/regexp1.html Regular Expression Matching Can Be Simple And Fast]: Keskustelua säännöllisten lausekkeiden toteutuksesta C-kielellä englanniksi.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30752</id>
		<title>Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30752"/>
		<updated>2010-02-17T00:25:44Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: /* Pakoluokat */ kor.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Säännöllinen lauseke&#039;&#039;&#039; (engl. &#039;&#039;&#039;regular expression&#039;&#039;&#039;, &#039;&#039;&#039;regexp&#039;&#039;&#039;) on yksinkertainen merkkijonokieli, joka voi joko &#039;&#039;vastata&#039;&#039; tai &#039;&#039;olla vastaamatta&#039;&#039; jotain toista merkkijonoa.  Linux- ja Unix-järjestelmissä säännöllisiä lauskkeista on suurta hyötyä [[komentorivi]]ä käytettäessä, mm. komennoissa [[awk]] ja [[grep]]. Niiden voidaankin sanoa olevan [[putki]]ttamiseen yhdistettynä tärkeimpiä työkaluja, joita komentorivin edistynyt käyttö edellyttää.&lt;br /&gt;
&lt;br /&gt;
== Teoriaa ==&lt;br /&gt;
Tietojenkäsittelytieteessä puhutaan [[wikipedia:fi:säännöllinen kieli|säännöllisestä kielestä]], joka voidaan tunnistaa [[wikipedia:fi:äärellinen automaatti|äärellisellä automaatilla]]. Säännöllisiä lausekkeita käytetään myös monissa ohjelmointikielissä (mm. Perl, Java, Python, ECMAScript). Mille tahansa [[wikipedia:en:Turing complete|Turing-täydelliselle]] ohjelmointikielelle voidaan kuitenkin aina kirjoittaa säännöllisten lausekkeiden [[wikipedia:fi:Ohjelmointikielen tulkki|tulkki]].&lt;br /&gt;
&lt;br /&gt;
== Johdatus säännöllisiin lausekkeisiin ==&lt;br /&gt;
&lt;br /&gt;
===Perusteet===&lt;br /&gt;
Säännöllinen lauseke joko &#039;&#039;vastaa&#039;&#039; tai &#039;&#039;ei vastaa&#039;&#039; merkkijonoa. Kutsutaan säännöllistä lauseketta &#039;&#039;lausekkeeksi&#039;&#039; ja merkkijonoa, jonka vastaavuus lausekkeeseen halutaan selvittää, &#039;&#039;kohteeksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lausekkeen yksinkertaiset kirjoitusmerkit vastaavat yksi-yhteen kohteen kirjoitusmerkkejä. Tämän vuoksi lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa yllätyksettömästi kohdetta&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei kohdetta&lt;br /&gt;
 bono&lt;br /&gt;
&lt;br /&gt;
Yleensä (mm. grep ja awk) katsotaan, että kohteen alussa ja lopussa voi olla mielivaltainen määrä ei-vastaavia merkkejä. Tällöin kohde (s.o. näiden komentojen tapauksessa &#039;&#039;rivi&#039;&#039;) vastaa lauseketta, jos edes jokin sen &#039;&#039;osa&#039;&#039; vastaa lauseketta. Siis grep ja awk -yhteydessä lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa kohdetta&lt;br /&gt;
 bo&#039;&#039;&#039;abba&#039;&#039;&#039;bo&lt;br /&gt;
ja&lt;br /&gt;
 dada&#039;&#039;&#039;abba&#039;&#039;&#039;gada&lt;br /&gt;
mutta ei silti kohdetta&lt;br /&gt;
 b&#039;&#039;&#039;abb&#039;&#039;&#039;bab&lt;br /&gt;
&lt;br /&gt;
===Operaattorit===&lt;br /&gt;
Yksi-yhteen vastaavien kirjoitusmerkkien lisäksi säännöllisissä lausekkeissa on mahdollisuus käyttää erilaisia &#039;&#039;operaattorimerkkejä&#039;&#039;, joilla on lausekkeessa erikoismerkitys.&lt;br /&gt;
&lt;br /&gt;
====Vaihtoehtoisuusoperaattori: &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Näistä ensimmäinen on operaattori &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;, joka tarkoittaa &#039;&#039;vaihtelua&#039;&#039; tai &#039;&#039;alternointia&#039;&#039; (engl. alternation). Sen merkitys on sama kuin luonnollisen kielen sanalla &amp;quot;tai&amp;quot;. Lauseke&lt;br /&gt;
 omena|luumu&lt;br /&gt;
vastaa sekä kohteita&lt;br /&gt;
 &#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
että&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;&lt;br /&gt;
Kun lisäksi muistamme yltä, että komentorivityökalujen tapauksessa kohde voi sisältää ei-vastaavia merkkejä sekä alussa että lopussa, vastaa ylläoleva lauseke &amp;lt;tt&amp;gt;omena|luumu&amp;lt;/tt&amp;gt; myös merkkijonoja&lt;br /&gt;
 uuni&#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
tai&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;soppa&lt;br /&gt;
Huomaa kuitenkin, että seuraavassa kohteessa vain ensimmäinen esiintymä vastaa lauseketta&lt;br /&gt;
 kotimainen &#039;&#039;&#039;omena&#039;&#039;&#039;-luumuhillo&lt;br /&gt;
&lt;br /&gt;
====Toisto-operaattorit====&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja ilmaisulla &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; on säännöllisissä lausekkeissa erikoismerkitys, joka vaikuttaa niitä &#039;&#039;välittömästi edeltävään&#039;&#039; merkkiin.&lt;br /&gt;
&lt;br /&gt;
=====Mielivaltaisen monta: &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, tai ei kertaakaan&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab*a&lt;br /&gt;
vastaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Todettakooon, että selvästi b-merkkien määrä kohteessa voi olla mielivaltainen, joten eri vastaavia kohdemerkkijonoja on olemassa myös ääretön määrä.&lt;br /&gt;
&lt;br /&gt;
=====Vähintään yksi: &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, mutta vähintään kerran&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab+a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====Ehdollinen: &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen kerran, tai ei kertaakaan&#039;&#039;&amp;quot;. Siten lauseke&lt;br /&gt;
 ab?a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bbbbbbbbbbbbbbbba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;ba&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====n:stä m:n kertaan: &amp;lt;tt&amp;gt;{n, m}&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Aina yllä olevat operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; eivät riitä, vaan jotain merkkiä tarvitsee vastata juuri tietyn määrän toistoja. Voitaisiin toki kirjoittaa&lt;br /&gt;
 aaaa?a?&lt;br /&gt;
jos halutaan vastata&lt;br /&gt;
 aaa&lt;br /&gt;
 aaaa&lt;br /&gt;
 aaaaa&lt;br /&gt;
mutta voidaan kirjoittaa lyhyemmin&lt;br /&gt;
 a{3,5}&lt;br /&gt;
Tämä tarkoittaa, että edeltävää merkkiä &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; voi esiintyä kolmesta viiteen kertaan. Käytetään yleisesti tästä ilmaisusta mallia &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; ovat mielivaltaisia kokonaislukuja, tarkoittaen &#039;&#039;&amp;quot;n:stä m:n kertaan&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Kumpi tahansa numeroista &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; voidaan jättää pois. Täten ilmaisu&lt;br /&gt;
 {n}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;tasan n kertaa&amp;quot;&#039;. Ilmaisu&lt;br /&gt;
 {n,}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;vähintään n kertaa&amp;quot;&#039;&#039;. Ilmaisu&lt;br /&gt;
 {,m}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;korkeintaan m kertaa&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sivuhuomatuksena todettakoon, että yllä olevan perusteella lyhyemmät operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; voitaisiin aina korvata ilmaisuilla &amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{1,}&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt; vastaavasti.&lt;br /&gt;
&lt;br /&gt;
===== Huomautuksia =====&lt;br /&gt;
Operaattoreita voi yhdistää mielivaltaisesti toisiinsa. Siten lauseke&lt;br /&gt;
 hur+a*!*&lt;br /&gt;
vastaavaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;hur&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurra&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa!&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurrraaa!!!!&#039;&#039;&#039;&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Toisaalta lauseke &#039;&#039;ei vastaa&#039;&#039; mitään seuraavista kohteista:&lt;br /&gt;
 burraa!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;aa!!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;uuurraa!!&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;urrur!!&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Tässä vaiheessa on hyvä varmistaa, että ymmärtää edellä esitetyn esimerkin kokonaisuudessaan.&lt;br /&gt;
&lt;br /&gt;
===Sulut: &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Kysymys:&#039;&#039;&#039; Jos halutaan vastata kohdetta &amp;lt;tt&amp;gt;hUrrUrrUrr&amp;lt;/tt&amp;gt; siten, että merkkijono &amp;lt;tt&amp;gt;Urr&amp;lt;/tt&amp;gt; voi esiintyä kohteessa äärettömän monta kertaa, miten tulee toimia?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vastaus:&#039;&#039;&#039; Tämä on mahdotonta tähän mennessä esitetyillä operaattoreilla. Voisimme toki kirjoittaa &amp;lt;tt&amp;gt;hU+r+r+&amp;lt;/tt&amp;gt; tai vastaavaa, mutta tämä vastaisi vain kohteita kuten &amp;lt;tt&amp;gt;hUUrrrr&amp;lt;/tt&amp;gt;. Tarvitsemme selvästi uuden operaattorin; &#039;&#039;sulut&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; voidaan määrittää lausekkeen osia, jotka samaan tapaan kuin koulumatematiikassa lasketaan &#039;&#039;ennen&#039;&#039; laskun muita osia. Koska säännöllisissä lausekkeissa ei kuitenkaan lasketa mitään, havainnollistetaan sulkujen merkitystä esittämällä ratkaisu yllä olevaan kysymykseen. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 h(Urr)+&lt;br /&gt;
vastaa kohteita&lt;br /&gt;
 &#039;&#039;&#039;hUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
jne. jne. Lauseke ei vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Arr&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Err&lt;br /&gt;
 burr&lt;br /&gt;
&lt;br /&gt;
Samoin kohde &lt;br /&gt;
 &#039;&#039;&#039;hUr&#039;&#039;&#039;&lt;br /&gt;
näyttää oikealta, mutta jää kuitenkin liian lyhyeksi, sillä sulkujen sisältö on löydyttävä kohteesta aina &#039;&#039;kokonaan&#039;&#039;. Siksi kohde &amp;lt;tt&amp;gt;hUr&amp;lt;/tt&amp;gt; &amp;lt;u&amp;gt;ei&amp;lt;/u&amp;gt; vastaa lauseketta &amp;lt;tt&amp;gt;h(Urr)+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Esimerkkejä====&lt;br /&gt;
&lt;br /&gt;
Sulkuja voi yhdistellä mielivaltaisesti kaikkiin operaattoreihin &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;. Seuraavassa on annettu sarja lausekkeita, sekä esimerkkejä kutakin vastaavista ja vastaamattomista kohteista:&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 d(ii)?pada+(pa|ba)?&lt;br /&gt;
vastaa esimerkiksi seuraavia kohteita&lt;br /&gt;
 &#039;&#039;&#039;diipadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista&lt;br /&gt;
 &#039;&#039;&#039;di&#039;&#039;&#039;padaapa&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;uu&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Viimeinen esimerkki jää lyhyeksi, sillä merkki &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; on lausekkeessa pakollinen vähintään kerran.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (hi|ha|ho)+&lt;br /&gt;
vastaa mitä tahansa kohdetta, jossa esiintyy mikä tahansa määrä merkkijonoja &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ha&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;ho&amp;lt;/tt&amp;gt; peräkkäin mielivaltaisen monta kertaa, kuitenkin vähintään kerran. Lauseke vastaa siis kaikkia seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;haha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hiha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hoho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihaho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hahohihohahi&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;e&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;u&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;uhu&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;ehe&lt;br /&gt;
&lt;br /&gt;
===Yhtä merkkiä vastaavat erikoismerkit===&lt;br /&gt;
Säännöllisissä lausekkeissa voi esiintyä myös joitain erikoismerkkejä, jotka eivät ole operaattoreita, eli ne eivät vaikuta niitä edeltäviin sulkuihin tai merkkeihin. Ne voitaisiin aina kirjoittaa lausekkeilla muotoa&lt;br /&gt;
 (merkki1|merkki2|merkki3|merkki4|...|merkkiN)&lt;br /&gt;
mutta tämä on varsin työlästä ja epäselkeää. Siksi säännöllisissä lausekkeissa on joitain erikoismerkkejä, jotka ovat oikopolkuja monimutkaisten vaihtoehtoisuuslausekkeiden kirjoittamiseen.&lt;br /&gt;
&lt;br /&gt;
====Jokerimerkki: &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Merkillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; (piste) on erikoismerkitys. Se vastaa aina &#039;&#039;mitä tahansa&#039;&#039; merkkiä. Lauseke&lt;br /&gt;
 .*&lt;br /&gt;
vastaa siis kaikkia mahdollisia kohteita - jopa tyhjää merkkijonoa, sillä operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa, että erikoisoperaattori &amp;quot;mikä tahansa merkki&amp;quot; voi esiintyä myös nolla kertaa. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (h.)+&lt;br /&gt;
vastaa siten kaikkia seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;he&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hy&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihrhy&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 rh&lt;br /&gt;
 ah&lt;br /&gt;
 oh&lt;br /&gt;
 ih&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;&lt;br /&gt;
Viimeinen esimerkki jää jälleen lyhyeksi, sillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; ei vastaa kuitenkaan &amp;quot;tyhjää&amp;quot; merkkiä.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 .upu&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
mutta myös&lt;br /&gt;
 &#039;&#039;&#039;supu&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 sepe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Merkkiluokat: &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan korjata ylläoleva Ankanpoika-esimerkki, voitaisiin kirjoittaa:&lt;br /&gt;
 (t|h|l|T|H|L)upu&lt;br /&gt;
joka vastaisi vain ja ainoastaan:&lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Merkkien &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; avulla voidaan määritellä kirjainluokkia siten, että seuraava merkki kohteessa vastaa vain ja ainoastaan jotain hakasulkujen välissä olevaa kirjainta. Siten äskeistä täysin vastaa lauseke on&lt;br /&gt;
 [thlTHL]upu&lt;br /&gt;
&lt;br /&gt;
Hakasulkujen välissä voidaan myös määritellä aakkoston mukaisia välejä väliviivalla &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;. Tällöin &lt;br /&gt;
 19[4-9][0-9]|20[0-9][0-9]&lt;br /&gt;
vastaa kaikkia vuosilukuja välillä 1940-2099. Samoin &lt;br /&gt;
 Osasto [A-I]&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;Osasto A&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto B&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto C&#039;&#039;&#039;&lt;br /&gt;
 ...&lt;br /&gt;
 &#039;&#039;&#039;Osasto H&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto I&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;Osasto &#039;&#039;&#039;J&lt;br /&gt;
&lt;br /&gt;
Jos merkki &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; halutaan sisällyttää hakasulkuilmaisuun, se jätetään viimeiseksi. Esim.&lt;br /&gt;
 Ala[ -]aste&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;Ala aste&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Ala-aste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jos oikea hakasulku (&amp;lt;tt&amp;gt;]&amp;lt;/tt&amp;gt;) halutaan sisällyttää hakasulkuilmaukseen, se laitetaan hakasulkujen ensimmäiseksi merkiksi. Esim.&lt;br /&gt;
 []abcdef]+&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;b&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ab]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;d]f&#039;&#039;&#039;&lt;br /&gt;
jne., mutta ei&lt;br /&gt;
 [gi&lt;br /&gt;
 zo&lt;br /&gt;
&lt;br /&gt;
Hakasulkuilmaisusn merkitys voidaan kääntää asettamalla hattu &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; sen ensimmäiseksi merkiksi. Tällöin hakasulkuilmaisu vastaa mitä tahansa hakasuluissa &amp;lt;u&amp;gt;&#039;&#039;&#039;ei&#039;&#039;&#039;&amp;lt;/u&amp;gt; esiintyvää merkkiä kohteessa. Täten lauseke&lt;br /&gt;
 [^aeiouyåäö]+&lt;br /&gt;
vastaa mitä tahansa pelkistä konsonanteista, välimerkeistä ja numeroista koostuvaa kohdetta, kuten&lt;br /&gt;
 &#039;&#039;&#039;prrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;123&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hkr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;brr-hrr&#039;&#039;&#039;&lt;br /&gt;
jne. Mutta ei&lt;br /&gt;
 au&lt;br /&gt;
 aiai&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Grepin hyväksymissä säännöllisissä lausekkeissa merkin &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; voi sisällyttää hakasulkuilmaukseen laittamalla sen miksi tahansa muuksi merkiksi, kuin hakasulkujen ensimmäinen merkki. Tämä ei pidä välttämättä paikkaansa kuitenkaan kaikilla säännöllisten lausekkeiden toteutuksilla, vaan hattumerkin eteen on mahdollisesti laitettava pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Pako-operaattori: &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan vastata jotain merkkiä, joka on määritelty operaattoriksi säännöllisissä lausekkeissa, sitä ei voida kirjoittaa sellaisenaan lausekkeeseen. Jos halutaan vastata tarkalleen jotain seuraavista&lt;br /&gt;
 Mitä?&lt;br /&gt;
 Missä?&lt;br /&gt;
 Milloin?&lt;br /&gt;
ei voida kirjoittaa lauseketta&lt;br /&gt;
 (Mi(tä|ssä|lloin))?&lt;br /&gt;
koska kysymysmerkki &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; lopussa vain ehdollista koko ulomman sulkuilmaisun, ja koko lauseke vastaisi siis vain joko tyhjää merkkijonoa tai kysymysmerkitöntä kysymyssanaa.&lt;br /&gt;
&lt;br /&gt;
Tarvitaan pako-operaattoria &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Merkin &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tai ylipäänsä minkä tahansa opraattorimerkin erikoismerkityksen voi poistaa asettamalla sen eteen kenoviivan. Tällöin kenoviivaa välittömästi seuraava merkki täytyy esiintyä kohteessa sellaisenaan. Oikea tapa kirjoittaa yllä oleva lauseke olisi siten&lt;br /&gt;
 (Mi(tä|ssä|lloin))\?&lt;br /&gt;
Tämä vastaa vain ja ainoastaan haluttuja merkkijonoja.&lt;br /&gt;
&lt;br /&gt;
Seuraavat operaattorit on merkittävä pako-operaattorilla, jos niitä ei haluta tulkittavan erikoismerkeiksi:&lt;br /&gt;
 ( ) | * + ? { } [ ] ^ $ \&lt;br /&gt;
&lt;br /&gt;
Siis, jos halutaan vastata kohteessa kenoviivaa, on kirjoitettava &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;. Esimerkiksi Windows-polku:&lt;br /&gt;
 &#039;&#039;&amp;lt;asema&amp;gt;&#039;&#039;:\Dokumentit\&#039;&#039;&amp;lt;nimi&amp;gt;&#039;&#039;.(doc, docx tai odt)&lt;br /&gt;
voidaan löytää esim. seuraavalla säännöllisellä lausekkeella:&lt;br /&gt;
 [A-Z]:\\Dokumentit\\[a-öA-Ö0-9 _-]+\.(doc|docx|odt)&lt;br /&gt;
&lt;br /&gt;
=== Rivin alku ja loppu: &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;===&lt;br /&gt;
On voinut herätä kysymys, kuinka voidaan vastata kohdetta (s.o. riviä) &#039;&#039;tarkalleen&#039;&#039;. Heti alussa selvisi, että esim grepin mielestä kohde (rivi) vastaa lauseketta, jos lauseke esiintyy missä tahansa kohdassa riviä. Jos halutaan, että lauseke vastaa alusta loppuun tarkalleen koko riviä, on otettava käyttöön erikoismerkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;. Nämä vastaavat kohteessa rivin tai merkkijonon alkua ja loppua kuvaavia &amp;quot;näkymättömiä&amp;quot; merkkejä vastaavasti. Siten&lt;br /&gt;
 ^abba$&lt;br /&gt;
vastaa vain riviä&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei esimerkiksi&lt;br /&gt;
 babba&lt;br /&gt;
 abbab&lt;br /&gt;
 babbab&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;abb&#039;&#039;&#039;bba&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki ====&lt;br /&gt;
&lt;br /&gt;
Merkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; antavat viimeisen silauksen grepin tehokkaaseen hyödyntämiseen. Nyt esimerkiksi, jos tulostetaan kaikki [[prosessi]]t komennolla &amp;lt;tt&amp;gt;[[ps]] -ef&amp;lt;/tt&amp;gt;, saadaan yleensä jokseenkin tälläinen listaus (esimerkissä palvelinkone):&lt;br /&gt;
 &lt;br /&gt;
 $ ps -ef&lt;br /&gt;
 UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
 root         1     0  0 Jan21 ?        00:00:34 init [2]      &lt;br /&gt;
 root      1425     1  0 Jan31 ?        00:00:00 /usr/sbin/xinetd&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
 root      5566     1  0 Jan21 ?        00:00:05 /usr/sbin/apache2 -k start&lt;br /&gt;
 root      6091     1  0 Jan21 ?        00:00:03 /usr/sbin/cron&lt;br /&gt;
 www-data 15379  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 www-data 15386  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 root     21684 32395  0 20:37 ?        00:00:00 sshd: user [priv]&lt;br /&gt;
 user     21688 21684  0 20:37 ?        00:00:00 sshd: user@pts/1&lt;br /&gt;
 user     21689 21688  0 20:37 pts/1    00:00:00 -bash&lt;br /&gt;
 user     21705 21689  0 20:37 pts/1    00:00:00 ps -ef&lt;br /&gt;
 syslog   32279     1  0 Jan21 ?        00:00:07 /sbin/syslogd -u syslog&lt;br /&gt;
 bind     32351     1  0 Jan31 ?        00:00:00 /usr/sbin/named&lt;br /&gt;
 root     32395     1  0 Jan21 ?        00:00:22 /usr/sbin/sshd&lt;br /&gt;
 (... jne ...)&lt;br /&gt;
&lt;br /&gt;
Jos haluamme ylläolevasta listasta vain &amp;quot;qmail&amp;quot; -alkuisten [[käyttäjä|käyttäjien]] prosessit, voisimme kirjoittaa&lt;br /&gt;
 ps -ef | grep qmail&lt;br /&gt;
Tämä kuitenkin tulostaa myös kaikki sellaiset prosessit, joiden nimikentässä esiintyy &amp;quot;qmail&amp;quot; – joukossa myös käyttäjän [[root]] prosesseja vastoin alkuperäistä tarkoitusta:&lt;br /&gt;
 $ ps -ef | grep qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger &#039;&#039;&#039;qmail&#039;&#039;&#039; 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-clean&lt;br /&gt;
&lt;br /&gt;
Ratkaisu qmail -alkuisten käyttäjien prosessien listaamiseen on:&lt;br /&gt;
 $ ps -ef | grep ^qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Hattumerkki &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; alussa vastaa jokaisen listausrivin alkua, jota pitää välittömästi seurata merkkijono &amp;lt;tt&amp;gt;qmail&amp;lt;/tt&amp;gt;, ja tämän jälkeen voi tulla mikä tahansa merkki (ilmaisu &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;). Grep tulostaa vain lausketta vastaavat rivit, ja tulos on haluttu.&lt;br /&gt;
&lt;br /&gt;
===== Pako komentotulkista =====&lt;br /&gt;
Jos halutaan antaa jokin monimutkaisempi ilmaisu, on hyvä asettaa säännöllinen lauseke yksinkertaisten heittomerkkien &amp;lt;tt&amp;gt;&#039;&amp;lt;/tt&amp;gt; sisään, jotta ne regexp-operaattorit, joillla on jokin erikoismerkitys [[komentotulkki|komeotulkissa]] eivät aiheuta ongelmia.&lt;br /&gt;
 $ echo moi | egrep m(o|a)i&lt;br /&gt;
 -bash: syntax error near unexpected token `(&#039;&lt;br /&gt;
Sululla &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; on erikoismerkitys komentotulkissa, samoin merkillä &amp;lt;tt&amp;gt;[[putki||]]&amp;lt;/tt&amp;gt;. Ratkaisu:&lt;br /&gt;
 $ echo moi | egrep &#039;m(o|a)i&#039;&lt;br /&gt;
 moi&lt;br /&gt;
Esimerkissä käytettiin komentoa egrep. Se on oikopolku grepin [[valitsin|valitsimelle]] &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;, joka ottaa säännöllisten lausekkeiden laajennetun tuen käyttöön. Normaalissa käytössä (pelkkö komento &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) operaattorit &amp;lt;tt&amp;gt;? + {} | (&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; eivät ole käytettävissä, paitsi asettamalla niiden eteen pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Jos ylläolevassa prosessilistausesimerkissä halutaan tulostaa pelkät prosessien [[PID]]-numerot, voidaan käyttää [[awk]]-työkalua seuraavasti:&lt;br /&gt;
 $ ps -ef | awk &#039;/^qmail/ { print $2 }&#039;&lt;br /&gt;
 3986&lt;br /&gt;
 3990&lt;br /&gt;
 3994&lt;br /&gt;
 3995&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä lausekkeista ==&lt;br /&gt;
Web-kuva:&lt;br /&gt;
 [^ ]+\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)&lt;br /&gt;
Päivämäärä muotoa pp.kk.vvvv:&lt;br /&gt;
 [0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}&lt;br /&gt;
2-merkkinen [[wikipedia:fi:heksadesimaalijärjestelmä|heksadesimaali]]:&lt;br /&gt;
 [0-9A-Fa-f]{2}&lt;br /&gt;
Sähköpostiosoite:&lt;br /&gt;
 [a-zA-Z0-9_]+@[a-zA-Z0-9_\.]+\.[a-zA-Z]{2,3}&lt;br /&gt;
&lt;br /&gt;
== Laajennukset ==&lt;br /&gt;
Yllä esitetty on hyvä lähtökohta säännöllisiin lausekkeisiin, ja kaikki modernit [[POSIX]]-yhteensopivat toteutukset tukevat mainittuja operaattoreita ja erikoismerkkejä. Monissa ohjelmointikielissä on tehty laajennuksia tähän, mutta esim. [[grep]] ei tue seuraavia. &lt;br /&gt;
&lt;br /&gt;
=== Pakoluokat ===&lt;br /&gt;
Jos halutaan kirjoittaa lause, joka jossain kohtaa vastaa mitä tahansa numeromerkkiä, voidaan kirjoittaa hakasulkuilmaus &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;. Tälläisille yleisesti käytetyille luokille on kuitenkin olemassa laajennuksissa helpompia nimiä. Kutsutaan näitä &#039;&#039;pakoluokiksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style: solid; border-collapse: collapse&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+&#039;&#039;&#039;Pakoluokat&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Ilmaisu !! Merkitys !! Vastaava hakasulkuilmaus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; || Mikä tahansa kirjain, numero tai alaviiva. || &amp;lt;tt&amp;gt;[a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\W&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa muu kuin kirjain, numero tai alaviiva. || &amp;lt;tt&amp;gt;[^a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; || Mikä tahansa tyhjä merkki (esim. välilyönti tai tabulaattori) || esim. &amp;lt;tt&amp;gt;[ \t]&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; tabulaattorimerkki&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-tyhjä merkki || esim. &amp;lt;tt&amp;gt;[^ \t]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; || Mikä tahansa numero. || &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\D&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-numero. || &amp;lt;tt&amp;gt;[^0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 \d+&lt;br /&gt;
vastaa siis kaikkia numeroita aivan siinä missä myös&lt;br /&gt;
 [0-9]+&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Grep]] ja [[Awk]]&lt;br /&gt;
** [[Putki]]&lt;br /&gt;
* [[Ed]] ja [[Sed]]: tuki säännöllisille lausekkeille&lt;br /&gt;
* [[Vi]] ja [[vim]]: näiden graaffinen tila&lt;br /&gt;
* [[Emacs]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[[wikipedia:fi:säännöllinen lauseke|Säännöllinen lauseke]]&lt;br /&gt;
*[[wikipedia:fi:äärellinen automaatti|Äärellinen automaatti]]&lt;br /&gt;
*[[wikipedia:fi:pinoautomaatti|Pinoautomaatti]]&lt;br /&gt;
*[[wikipedia:fi:turingin kone|Turingin kone]]&lt;br /&gt;
*[http://www.ohjelmointiputka.net/opas.php?tunnus=phpsl Säännölliset lausekkeet PHP:ssä] -opas Ohjelmointiputkassa&lt;br /&gt;
*[http://swtch.com/~rsc/regexp/regexp1.html Regular Expression Matching Can Be Simple And Fast]: Keskustelua säännöllisten lausekkeiden toteutuksesta C-kielellä englanniksi.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30751</id>
		<title>Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30751"/>
		<updated>2010-02-17T00:24:37Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: /* Esimerkki */ korostus. esimerkit ovat osa vähän köykäisiä, joten parempia saa mielellään ehdottaa&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Säännöllinen lauseke&#039;&#039;&#039; (engl. &#039;&#039;&#039;regular expression&#039;&#039;&#039;, &#039;&#039;&#039;regexp&#039;&#039;&#039;) on yksinkertainen merkkijonokieli, joka voi joko &#039;&#039;vastata&#039;&#039; tai &#039;&#039;olla vastaamatta&#039;&#039; jotain toista merkkijonoa.  Linux- ja Unix-järjestelmissä säännöllisiä lauskkeista on suurta hyötyä [[komentorivi]]ä käytettäessä, mm. komennoissa [[awk]] ja [[grep]]. Niiden voidaankin sanoa olevan [[putki]]ttamiseen yhdistettynä tärkeimpiä työkaluja, joita komentorivin edistynyt käyttö edellyttää.&lt;br /&gt;
&lt;br /&gt;
== Teoriaa ==&lt;br /&gt;
Tietojenkäsittelytieteessä puhutaan [[wikipedia:fi:säännöllinen kieli|säännöllisestä kielestä]], joka voidaan tunnistaa [[wikipedia:fi:äärellinen automaatti|äärellisellä automaatilla]]. Säännöllisiä lausekkeita käytetään myös monissa ohjelmointikielissä (mm. Perl, Java, Python, ECMAScript). Mille tahansa [[wikipedia:en:Turing complete|Turing-täydelliselle]] ohjelmointikielelle voidaan kuitenkin aina kirjoittaa säännöllisten lausekkeiden [[wikipedia:fi:Ohjelmointikielen tulkki|tulkki]].&lt;br /&gt;
&lt;br /&gt;
== Johdatus säännöllisiin lausekkeisiin ==&lt;br /&gt;
&lt;br /&gt;
===Perusteet===&lt;br /&gt;
Säännöllinen lauseke joko &#039;&#039;vastaa&#039;&#039; tai &#039;&#039;ei vastaa&#039;&#039; merkkijonoa. Kutsutaan säännöllistä lauseketta &#039;&#039;lausekkeeksi&#039;&#039; ja merkkijonoa, jonka vastaavuus lausekkeeseen halutaan selvittää, &#039;&#039;kohteeksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lausekkeen yksinkertaiset kirjoitusmerkit vastaavat yksi-yhteen kohteen kirjoitusmerkkejä. Tämän vuoksi lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa yllätyksettömästi kohdetta&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei kohdetta&lt;br /&gt;
 bono&lt;br /&gt;
&lt;br /&gt;
Yleensä (mm. grep ja awk) katsotaan, että kohteen alussa ja lopussa voi olla mielivaltainen määrä ei-vastaavia merkkejä. Tällöin kohde (s.o. näiden komentojen tapauksessa &#039;&#039;rivi&#039;&#039;) vastaa lauseketta, jos edes jokin sen &#039;&#039;osa&#039;&#039; vastaa lauseketta. Siis grep ja awk -yhteydessä lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa kohdetta&lt;br /&gt;
 bo&#039;&#039;&#039;abba&#039;&#039;&#039;bo&lt;br /&gt;
ja&lt;br /&gt;
 dada&#039;&#039;&#039;abba&#039;&#039;&#039;gada&lt;br /&gt;
mutta ei silti kohdetta&lt;br /&gt;
 b&#039;&#039;&#039;abb&#039;&#039;&#039;bab&lt;br /&gt;
&lt;br /&gt;
===Operaattorit===&lt;br /&gt;
Yksi-yhteen vastaavien kirjoitusmerkkien lisäksi säännöllisissä lausekkeissa on mahdollisuus käyttää erilaisia &#039;&#039;operaattorimerkkejä&#039;&#039;, joilla on lausekkeessa erikoismerkitys.&lt;br /&gt;
&lt;br /&gt;
====Vaihtoehtoisuusoperaattori: &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Näistä ensimmäinen on operaattori &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;, joka tarkoittaa &#039;&#039;vaihtelua&#039;&#039; tai &#039;&#039;alternointia&#039;&#039; (engl. alternation). Sen merkitys on sama kuin luonnollisen kielen sanalla &amp;quot;tai&amp;quot;. Lauseke&lt;br /&gt;
 omena|luumu&lt;br /&gt;
vastaa sekä kohteita&lt;br /&gt;
 &#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
että&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;&lt;br /&gt;
Kun lisäksi muistamme yltä, että komentorivityökalujen tapauksessa kohde voi sisältää ei-vastaavia merkkejä sekä alussa että lopussa, vastaa ylläoleva lauseke &amp;lt;tt&amp;gt;omena|luumu&amp;lt;/tt&amp;gt; myös merkkijonoja&lt;br /&gt;
 uuni&#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
tai&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;soppa&lt;br /&gt;
Huomaa kuitenkin, että seuraavassa kohteessa vain ensimmäinen esiintymä vastaa lauseketta&lt;br /&gt;
 kotimainen &#039;&#039;&#039;omena&#039;&#039;&#039;-luumuhillo&lt;br /&gt;
&lt;br /&gt;
====Toisto-operaattorit====&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja ilmaisulla &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; on säännöllisissä lausekkeissa erikoismerkitys, joka vaikuttaa niitä &#039;&#039;välittömästi edeltävään&#039;&#039; merkkiin.&lt;br /&gt;
&lt;br /&gt;
=====Mielivaltaisen monta: &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, tai ei kertaakaan&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab*a&lt;br /&gt;
vastaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Todettakooon, että selvästi b-merkkien määrä kohteessa voi olla mielivaltainen, joten eri vastaavia kohdemerkkijonoja on olemassa myös ääretön määrä.&lt;br /&gt;
&lt;br /&gt;
=====Vähintään yksi: &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, mutta vähintään kerran&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab+a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====Ehdollinen: &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen kerran, tai ei kertaakaan&#039;&#039;&amp;quot;. Siten lauseke&lt;br /&gt;
 ab?a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bbbbbbbbbbbbbbbba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;ba&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====n:stä m:n kertaan: &amp;lt;tt&amp;gt;{n, m}&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Aina yllä olevat operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; eivät riitä, vaan jotain merkkiä tarvitsee vastata juuri tietyn määrän toistoja. Voitaisiin toki kirjoittaa&lt;br /&gt;
 aaaa?a?&lt;br /&gt;
jos halutaan vastata&lt;br /&gt;
 aaa&lt;br /&gt;
 aaaa&lt;br /&gt;
 aaaaa&lt;br /&gt;
mutta voidaan kirjoittaa lyhyemmin&lt;br /&gt;
 a{3,5}&lt;br /&gt;
Tämä tarkoittaa, että edeltävää merkkiä &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; voi esiintyä kolmesta viiteen kertaan. Käytetään yleisesti tästä ilmaisusta mallia &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; ovat mielivaltaisia kokonaislukuja, tarkoittaen &#039;&#039;&amp;quot;n:stä m:n kertaan&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Kumpi tahansa numeroista &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; voidaan jättää pois. Täten ilmaisu&lt;br /&gt;
 {n}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;tasan n kertaa&amp;quot;&#039;. Ilmaisu&lt;br /&gt;
 {n,}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;vähintään n kertaa&amp;quot;&#039;&#039;. Ilmaisu&lt;br /&gt;
 {,m}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;korkeintaan m kertaa&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sivuhuomatuksena todettakoon, että yllä olevan perusteella lyhyemmät operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; voitaisiin aina korvata ilmaisuilla &amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{1,}&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt; vastaavasti.&lt;br /&gt;
&lt;br /&gt;
===== Huomautuksia =====&lt;br /&gt;
Operaattoreita voi yhdistää mielivaltaisesti toisiinsa. Siten lauseke&lt;br /&gt;
 hur+a*!*&lt;br /&gt;
vastaavaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;hur&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurra&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa!&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurrraaa!!!!&#039;&#039;&#039;&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Toisaalta lauseke &#039;&#039;ei vastaa&#039;&#039; mitään seuraavista kohteista:&lt;br /&gt;
 burraa!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;aa!!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;uuurraa!!&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;urrur!!&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Tässä vaiheessa on hyvä varmistaa, että ymmärtää edellä esitetyn esimerkin kokonaisuudessaan.&lt;br /&gt;
&lt;br /&gt;
===Sulut: &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Kysymys:&#039;&#039;&#039; Jos halutaan vastata kohdetta &amp;lt;tt&amp;gt;hUrrUrrUrr&amp;lt;/tt&amp;gt; siten, että merkkijono &amp;lt;tt&amp;gt;Urr&amp;lt;/tt&amp;gt; voi esiintyä kohteessa äärettömän monta kertaa, miten tulee toimia?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vastaus:&#039;&#039;&#039; Tämä on mahdotonta tähän mennessä esitetyillä operaattoreilla. Voisimme toki kirjoittaa &amp;lt;tt&amp;gt;hU+r+r+&amp;lt;/tt&amp;gt; tai vastaavaa, mutta tämä vastaisi vain kohteita kuten &amp;lt;tt&amp;gt;hUUrrrr&amp;lt;/tt&amp;gt;. Tarvitsemme selvästi uuden operaattorin; &#039;&#039;sulut&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; voidaan määrittää lausekkeen osia, jotka samaan tapaan kuin koulumatematiikassa lasketaan &#039;&#039;ennen&#039;&#039; laskun muita osia. Koska säännöllisissä lausekkeissa ei kuitenkaan lasketa mitään, havainnollistetaan sulkujen merkitystä esittämällä ratkaisu yllä olevaan kysymykseen. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 h(Urr)+&lt;br /&gt;
vastaa kohteita&lt;br /&gt;
 &#039;&#039;&#039;hUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
jne. jne. Lauseke ei vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Arr&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Err&lt;br /&gt;
 burr&lt;br /&gt;
&lt;br /&gt;
Samoin kohde &lt;br /&gt;
 &#039;&#039;&#039;hUr&#039;&#039;&#039;&lt;br /&gt;
näyttää oikealta, mutta jää kuitenkin liian lyhyeksi, sillä sulkujen sisältö on löydyttävä kohteesta aina &#039;&#039;kokonaan&#039;&#039;. Siksi kohde &amp;lt;tt&amp;gt;hUr&amp;lt;/tt&amp;gt; &amp;lt;u&amp;gt;ei&amp;lt;/u&amp;gt; vastaa lauseketta &amp;lt;tt&amp;gt;h(Urr)+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Esimerkkejä====&lt;br /&gt;
&lt;br /&gt;
Sulkuja voi yhdistellä mielivaltaisesti kaikkiin operaattoreihin &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;. Seuraavassa on annettu sarja lausekkeita, sekä esimerkkejä kutakin vastaavista ja vastaamattomista kohteista:&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 d(ii)?pada+(pa|ba)?&lt;br /&gt;
vastaa esimerkiksi seuraavia kohteita&lt;br /&gt;
 &#039;&#039;&#039;diipadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista&lt;br /&gt;
 &#039;&#039;&#039;di&#039;&#039;&#039;padaapa&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;uu&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Viimeinen esimerkki jää lyhyeksi, sillä merkki &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; on lausekkeessa pakollinen vähintään kerran.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (hi|ha|ho)+&lt;br /&gt;
vastaa mitä tahansa kohdetta, jossa esiintyy mikä tahansa määrä merkkijonoja &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ha&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;ho&amp;lt;/tt&amp;gt; peräkkäin mielivaltaisen monta kertaa, kuitenkin vähintään kerran. Lauseke vastaa siis kaikkia seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;haha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hiha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hoho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihaho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hahohihohahi&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;e&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;u&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;uhu&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;ehe&lt;br /&gt;
&lt;br /&gt;
===Yhtä merkkiä vastaavat erikoismerkit===&lt;br /&gt;
Säännöllisissä lausekkeissa voi esiintyä myös joitain erikoismerkkejä, jotka eivät ole operaattoreita, eli ne eivät vaikuta niitä edeltäviin sulkuihin tai merkkeihin. Ne voitaisiin aina kirjoittaa lausekkeilla muotoa&lt;br /&gt;
 (merkki1|merkki2|merkki3|merkki4|...|merkkiN)&lt;br /&gt;
mutta tämä on varsin työlästä ja epäselkeää. Siksi säännöllisissä lausekkeissa on joitain erikoismerkkejä, jotka ovat oikopolkuja monimutkaisten vaihtoehtoisuuslausekkeiden kirjoittamiseen.&lt;br /&gt;
&lt;br /&gt;
====Jokerimerkki: &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Merkillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; (piste) on erikoismerkitys. Se vastaa aina &#039;&#039;mitä tahansa&#039;&#039; merkkiä. Lauseke&lt;br /&gt;
 .*&lt;br /&gt;
vastaa siis kaikkia mahdollisia kohteita - jopa tyhjää merkkijonoa, sillä operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa, että erikoisoperaattori &amp;quot;mikä tahansa merkki&amp;quot; voi esiintyä myös nolla kertaa. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (h.)+&lt;br /&gt;
vastaa siten kaikkia seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;he&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hy&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihrhy&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 rh&lt;br /&gt;
 ah&lt;br /&gt;
 oh&lt;br /&gt;
 ih&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;&lt;br /&gt;
Viimeinen esimerkki jää jälleen lyhyeksi, sillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; ei vastaa kuitenkaan &amp;quot;tyhjää&amp;quot; merkkiä.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 .upu&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
mutta myös&lt;br /&gt;
 &#039;&#039;&#039;supu&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 sepe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Merkkiluokat: &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan korjata ylläoleva Ankanpoika-esimerkki, voitaisiin kirjoittaa:&lt;br /&gt;
 (t|h|l|T|H|L)upu&lt;br /&gt;
joka vastaisi vain ja ainoastaan:&lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Merkkien &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; avulla voidaan määritellä kirjainluokkia siten, että seuraava merkki kohteessa vastaa vain ja ainoastaan jotain hakasulkujen välissä olevaa kirjainta. Siten äskeistä täysin vastaa lauseke on&lt;br /&gt;
 [thlTHL]upu&lt;br /&gt;
&lt;br /&gt;
Hakasulkujen välissä voidaan myös määritellä aakkoston mukaisia välejä väliviivalla &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;. Tällöin &lt;br /&gt;
 19[4-9][0-9]|20[0-9][0-9]&lt;br /&gt;
vastaa kaikkia vuosilukuja välillä 1940-2099. Samoin &lt;br /&gt;
 Osasto [A-I]&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;Osasto A&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto B&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto C&#039;&#039;&#039;&lt;br /&gt;
 ...&lt;br /&gt;
 &#039;&#039;&#039;Osasto H&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto I&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;Osasto &#039;&#039;&#039;J&lt;br /&gt;
&lt;br /&gt;
Jos merkki &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; halutaan sisällyttää hakasulkuilmaisuun, se jätetään viimeiseksi. Esim.&lt;br /&gt;
 Ala[ -]aste&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;Ala aste&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Ala-aste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jos oikea hakasulku (&amp;lt;tt&amp;gt;]&amp;lt;/tt&amp;gt;) halutaan sisällyttää hakasulkuilmaukseen, se laitetaan hakasulkujen ensimmäiseksi merkiksi. Esim.&lt;br /&gt;
 []abcdef]+&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;b&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ab]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;d]f&#039;&#039;&#039;&lt;br /&gt;
jne., mutta ei&lt;br /&gt;
 [gi&lt;br /&gt;
 zo&lt;br /&gt;
&lt;br /&gt;
Hakasulkuilmaisusn merkitys voidaan kääntää asettamalla hattu &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; sen ensimmäiseksi merkiksi. Tällöin hakasulkuilmaisu vastaa mitä tahansa hakasuluissa &amp;lt;u&amp;gt;&#039;&#039;&#039;ei&#039;&#039;&#039;&amp;lt;/u&amp;gt; esiintyvää merkkiä kohteessa. Täten lauseke&lt;br /&gt;
 [^aeiouyåäö]+&lt;br /&gt;
vastaa mitä tahansa pelkistä konsonanteista, välimerkeistä ja numeroista koostuvaa kohdetta, kuten&lt;br /&gt;
 &#039;&#039;&#039;prrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;123&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hkr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;brr-hrr&#039;&#039;&#039;&lt;br /&gt;
jne. Mutta ei&lt;br /&gt;
 au&lt;br /&gt;
 aiai&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Grepin hyväksymissä säännöllisissä lausekkeissa merkin &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; voi sisällyttää hakasulkuilmaukseen laittamalla sen miksi tahansa muuksi merkiksi, kuin hakasulkujen ensimmäinen merkki. Tämä ei pidä välttämättä paikkaansa kuitenkaan kaikilla säännöllisten lausekkeiden toteutuksilla, vaan hattumerkin eteen on mahdollisesti laitettava pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Pako-operaattori: &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan vastata jotain merkkiä, joka on määritelty operaattoriksi säännöllisissä lausekkeissa, sitä ei voida kirjoittaa sellaisenaan lausekkeeseen. Jos halutaan vastata tarkalleen jotain seuraavista&lt;br /&gt;
 Mitä?&lt;br /&gt;
 Missä?&lt;br /&gt;
 Milloin?&lt;br /&gt;
ei voida kirjoittaa lauseketta&lt;br /&gt;
 (Mi(tä|ssä|lloin))?&lt;br /&gt;
koska kysymysmerkki &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; lopussa vain ehdollista koko ulomman sulkuilmaisun, ja koko lauseke vastaisi siis vain joko tyhjää merkkijonoa tai kysymysmerkitöntä kysymyssanaa.&lt;br /&gt;
&lt;br /&gt;
Tarvitaan pako-operaattoria &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Merkin &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tai ylipäänsä minkä tahansa opraattorimerkin erikoismerkityksen voi poistaa asettamalla sen eteen kenoviivan. Tällöin kenoviivaa välittömästi seuraava merkki täytyy esiintyä kohteessa sellaisenaan. Oikea tapa kirjoittaa yllä oleva lauseke olisi siten&lt;br /&gt;
 (Mi(tä|ssä|lloin))\?&lt;br /&gt;
Tämä vastaa vain ja ainoastaan haluttuja merkkijonoja.&lt;br /&gt;
&lt;br /&gt;
Seuraavat operaattorit on merkittävä pako-operaattorilla, jos niitä ei haluta tulkittavan erikoismerkeiksi:&lt;br /&gt;
 ( ) | * + ? { } [ ] ^ $ \&lt;br /&gt;
&lt;br /&gt;
Siis, jos halutaan vastata kohteessa kenoviivaa, on kirjoitettava &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;. Esimerkiksi Windows-polku:&lt;br /&gt;
 &#039;&#039;&amp;lt;asema&amp;gt;&#039;&#039;:\Dokumentit\&#039;&#039;&amp;lt;nimi&amp;gt;&#039;&#039;.(doc, docx tai odt)&lt;br /&gt;
voidaan löytää esim. seuraavalla säännöllisellä lausekkeella:&lt;br /&gt;
 [A-Z]:\\Dokumentit\\[a-öA-Ö0-9 _-]+\.(doc|docx|odt)&lt;br /&gt;
&lt;br /&gt;
=== Rivin alku ja loppu: &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;===&lt;br /&gt;
On voinut herätä kysymys, kuinka voidaan vastata kohdetta (s.o. riviä) &#039;&#039;tarkalleen&#039;&#039;. Heti alussa selvisi, että esim grepin mielestä kohde (rivi) vastaa lauseketta, jos lauseke esiintyy missä tahansa kohdassa riviä. Jos halutaan, että lauseke vastaa alusta loppuun tarkalleen koko riviä, on otettava käyttöön erikoismerkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;. Nämä vastaavat kohteessa rivin tai merkkijonon alkua ja loppua kuvaavia &amp;quot;näkymättömiä&amp;quot; merkkejä vastaavasti. Siten&lt;br /&gt;
 ^abba$&lt;br /&gt;
vastaa vain riviä&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei esimerkiksi&lt;br /&gt;
 babba&lt;br /&gt;
 abbab&lt;br /&gt;
 babbab&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;abb&#039;&#039;&#039;bba&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki ====&lt;br /&gt;
&lt;br /&gt;
Merkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; antavat viimeisen silauksen grepin tehokkaaseen hyödyntämiseen. Nyt esimerkiksi, jos tulostetaan kaikki [[prosessi]]t komennolla &amp;lt;tt&amp;gt;[[ps]] -ef&amp;lt;/tt&amp;gt;, saadaan yleensä jokseenkin tälläinen listaus (esimerkissä palvelinkone):&lt;br /&gt;
 &lt;br /&gt;
 $ ps -ef&lt;br /&gt;
 UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
 root         1     0  0 Jan21 ?        00:00:34 init [2]      &lt;br /&gt;
 root      1425     1  0 Jan31 ?        00:00:00 /usr/sbin/xinetd&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
 root      5566     1  0 Jan21 ?        00:00:05 /usr/sbin/apache2 -k start&lt;br /&gt;
 root      6091     1  0 Jan21 ?        00:00:03 /usr/sbin/cron&lt;br /&gt;
 www-data 15379  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 www-data 15386  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 root     21684 32395  0 20:37 ?        00:00:00 sshd: user [priv]&lt;br /&gt;
 user     21688 21684  0 20:37 ?        00:00:00 sshd: user@pts/1&lt;br /&gt;
 user     21689 21688  0 20:37 pts/1    00:00:00 -bash&lt;br /&gt;
 user     21705 21689  0 20:37 pts/1    00:00:00 ps -ef&lt;br /&gt;
 syslog   32279     1  0 Jan21 ?        00:00:07 /sbin/syslogd -u syslog&lt;br /&gt;
 bind     32351     1  0 Jan31 ?        00:00:00 /usr/sbin/named&lt;br /&gt;
 root     32395     1  0 Jan21 ?        00:00:22 /usr/sbin/sshd&lt;br /&gt;
 (... jne ...)&lt;br /&gt;
&lt;br /&gt;
Jos haluamme ylläolevasta listasta vain &amp;quot;qmail&amp;quot; -alkuisten [[käyttäjä|käyttäjien]] prosessit, voisimme kirjoittaa&lt;br /&gt;
 ps -ef | grep qmail&lt;br /&gt;
Tämä kuitenkin tulostaa myös kaikki sellaiset prosessit, joiden nimikentässä esiintyy &amp;quot;qmail&amp;quot; – joukossa myös käyttäjän [[root]] prosesseja vastoin alkuperäistä tarkoitusta:&lt;br /&gt;
 $ ps -ef | grep qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger &#039;&#039;&#039;qmail&#039;&#039;&#039; 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 &#039;&#039;&#039;qmail&#039;&#039;&#039;-clean&lt;br /&gt;
&lt;br /&gt;
Ratkaisu qmail -alkuisten käyttäjien prosessien listaamiseen on:&lt;br /&gt;
 $ ps -ef | grep ^qmail&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;s    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;l    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;r    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 &#039;&#039;&#039;qmail&#039;&#039;&#039;q    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Hattumerkki &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; alussa vastaa jokaisen listausrivin alkua, jota pitää välittömästi seurata merkkijono &amp;lt;tt&amp;gt;qmail&amp;lt;/tt&amp;gt;, ja tämän jälkeen voi tulla mikä tahansa merkki (ilmaisu &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;). Grep tulostaa vain lausketta vastaavat rivit, ja tulos on haluttu.&lt;br /&gt;
&lt;br /&gt;
===== Pako komentotulkista =====&lt;br /&gt;
Jos halutaan antaa jokin monimutkaisempi ilmaisu, on hyvä asettaa säännöllinen lauseke yksinkertaisten heittomerkkien &amp;lt;tt&amp;gt;&#039;&amp;lt;/tt&amp;gt; sisään, jotta ne regexp-operaattorit, joillla on jokin erikoismerkitys [[komentotulkki|komeotulkissa]] eivät aiheuta ongelmia.&lt;br /&gt;
 $ echo moi | egrep m(o|a)i&lt;br /&gt;
 -bash: syntax error near unexpected token `(&#039;&lt;br /&gt;
Sululla &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; on erikoismerkitys komentotulkissa, samoin merkillä &amp;lt;tt&amp;gt;[[putki||]]&amp;lt;/tt&amp;gt;. Ratkaisu:&lt;br /&gt;
 $ echo moi | egrep &#039;m(o|a)i&#039;&lt;br /&gt;
 moi&lt;br /&gt;
Esimerkissä käytettiin komentoa egrep. Se on oikopolku grepin [[valitsin|valitsimelle]] &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;, joka ottaa säännöllisten lausekkeiden laajennetun tuen käyttöön. Normaalissa käytössä (pelkkö komento &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) operaattorit &amp;lt;tt&amp;gt;? + {} | (&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; eivät ole käytettävissä, paitsi asettamalla niiden eteen pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Jos ylläolevassa prosessilistausesimerkissä halutaan tulostaa pelkät prosessien [[PID]]-numerot, voidaan käyttää [[awk]]-työkalua seuraavasti:&lt;br /&gt;
 $ ps -ef | awk &#039;/^qmail/ { print $2 }&#039;&lt;br /&gt;
 3986&lt;br /&gt;
 3990&lt;br /&gt;
 3994&lt;br /&gt;
 3995&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä lausekkeista ==&lt;br /&gt;
Web-kuva:&lt;br /&gt;
 [^ ]+\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)&lt;br /&gt;
Päivämäärä muotoa pp.kk.vvvv:&lt;br /&gt;
 [0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}&lt;br /&gt;
2-merkkinen [[wikipedia:fi:heksadesimaalijärjestelmä|heksadesimaali]]:&lt;br /&gt;
 [0-9A-Fa-f]{2}&lt;br /&gt;
Sähköpostiosoite:&lt;br /&gt;
 [a-zA-Z0-9_]+@[a-zA-Z0-9_\.]+\.[a-zA-Z]{2,3}&lt;br /&gt;
&lt;br /&gt;
== Laajennukset ==&lt;br /&gt;
Yllä esitetty on hyvä lähtökohta säännöllisiin lausekkeisiin, ja kaikki modernit [[POSIX]]-yhteensopivat toteutukset tukevat mainittuja operaattoreita ja erikoismerkkejä. Monissa ohjelmointikielissä on tehty laajennuksia tähän, mutta esim. [[grep]] ei tue seuraavia. &lt;br /&gt;
&lt;br /&gt;
=== Pakoluokat ===&lt;br /&gt;
Jos halutaan kirjoittaa lause, joka jossain kohtaa vastaa mitä tahansa numeromerkkiä, voidaan kirjoittaa hakasulkuilmaus &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;. Tälläisille yleisesti käytetyille luokille on kuitenkin olemassa laajennuksissa helpompia nimiä. Kutsutaan näitä pakoluokiksi.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style: solid; border-collapse: collapse&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+&#039;&#039;&#039;Pakoluokat&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Ilmaisu !! Merkitys !! Vastaava hakasulkuilmaus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; || Mikä tahansa kirjain, numero tai alaviiva. || &amp;lt;tt&amp;gt;[a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\W&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa muu kuin kirjain, numero tai alaviiva. || &amp;lt;tt&amp;gt;[^a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; || Mikä tahansa tyhjä merkki (esim. välilyönti tai tabulaattori) || esim. &amp;lt;tt&amp;gt;[ \t]&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; tabulaattorimerkki&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-tyhjä merkki || esim. &amp;lt;tt&amp;gt;[^ \t]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; || Mikä tahansa numero. || &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\D&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-numero. || &amp;lt;tt&amp;gt;[^0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 \d+&lt;br /&gt;
vastaa siis kaikkia numeroita aivan siinä missä myös&lt;br /&gt;
 [0-9]+&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Grep]] ja [[Awk]]&lt;br /&gt;
** [[Putki]]&lt;br /&gt;
* [[Ed]] ja [[Sed]]: tuki säännöllisille lausekkeille&lt;br /&gt;
* [[Vi]] ja [[vim]]: näiden graaffinen tila&lt;br /&gt;
* [[Emacs]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[[wikipedia:fi:säännöllinen lauseke|Säännöllinen lauseke]]&lt;br /&gt;
*[[wikipedia:fi:äärellinen automaatti|Äärellinen automaatti]]&lt;br /&gt;
*[[wikipedia:fi:pinoautomaatti|Pinoautomaatti]]&lt;br /&gt;
*[[wikipedia:fi:turingin kone|Turingin kone]]&lt;br /&gt;
*[http://www.ohjelmointiputka.net/opas.php?tunnus=phpsl Säännölliset lausekkeet PHP:ssä] -opas Ohjelmointiputkassa&lt;br /&gt;
*[http://swtch.com/~rsc/regexp/regexp1.html Regular Expression Matching Can Be Simple And Fast]: Keskustelua säännöllisten lausekkeiden toteutuksesta C-kielellä englanniksi.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=EOF&amp;diff=30750</id>
		<title>EOF</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=EOF&amp;diff=30750"/>
		<updated>2010-02-16T22:51:41Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: /* Terminaalissa */ +&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;EOF&#039;&#039;&#039; eli &#039;&#039;&#039;loppumerkki&#039;&#039;&#039; on C-ohjelmoinnissa ja yleisesti Unix-järjestelmissä tiedoston lopusta kertova erikoismerkki. Kun ohjelma lukee tiedostosta loppumerkin EOF, se tarkoittaa yleensä, että tiedoston loppu on saavutettu, eikä lisää tietoa ole enää saatavilla.&lt;br /&gt;
&lt;br /&gt;
== C-ohjelmoinnissa ==&lt;br /&gt;
C-ohjelman kannalta tiedostot näkyvät [[tiedostokuvain|tiedostokuvaimina]] (engl. &#039;&#039;file descriptor&#039;&#039;). Tiedostokuvaimesta, joka yleensä on liitetty tiedostoon, mutta voi olla liitetty myös johonkin [[standardivirta]]an tai [[putki|putkeen]], voi lukea tavuja standardikirjaston kutsulla &#039;&#039;fgetc()&#039;&#039;. Kutsu palauttaa normaalisti tiedoston seuraavan 8-bittisen merkin, mutta mikäli tiedosto on lopussa tai lukemisessa tapahtuu virhe, kutsu palauttaa erikoisarvon EOF. EOF ei ole positiivinen 8-bittinen kokonaisluku (s.o. luku väliltä 0-255), vaan negatiivinen &#039;&#039;int&#039;&#039; -arvo. Näin mikään tiedosto ei voi sisältää merkkiä EOF, eikä sitä voi tallettaa tyyppiin &#039;&#039;unsigned char&#039;&#039;. Siksi paluuarvo EOF on aina erikoistapaus.&lt;br /&gt;
&lt;br /&gt;
C-ohjelman tulee aina erikseen varmistaa, merkitseekö EOF -paluuarvo todella tiedoston loppua vaiko virhetilannetta kutsulla &#039;&#039;feof()&#039;&#039; tai &#039;&#039;ferror()&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ASCII-loppumerkki 0x04 ==&lt;br /&gt;
Loppumerkkiä läheisesti muistuttaa ASCII-merkki 0x04 (End of Transmission). Vanhoissa järjestelmissä, kuten [[wikipedia:fi:CP/M|CP/M]] järjestelmä talletti jokaisen tiedoston osalta vain sille varattujen talletuslohkojen määrän. Mikäli tiedostoon tallennettu data loppui talletuslohkojen välissä, tiedoston lopusta kertoi erikoismerkki 0x04. Tälläinen tiedosto ei voi tietenkään sisältää muuaalla kontrollimerkkiä 0x04, joka aiheuttaisi vakavia ongelmia nykyisissä järjestelmissä, joiden levyille saatetaan tallettaa mm. salattua tai pakattua binääritietoa. Siksi termillä EOF viitataan nykyisin Linux- ja Unix järjestelmissä useimmiten negatiiviseen lukufunktion paluuarvoon EOF, joka ei voi vastata arvoltaan mitään aitoa merkkiä, esimerkiksi ASCII-kontrollimerkkiä.&lt;br /&gt;
&lt;br /&gt;
== Terminaalissa ==&lt;br /&gt;
Syötteen voi terminaalissa lopettaa antamalla erikoismerkin &amp;lt;tt&amp;gt;^D&amp;lt;/tt&amp;gt;, joka PC-järjestelmissä tapahtuu painamalla Ctrl ja D kirjaimia samaan aikaan. Tämä johtaa terminaaliajurin vaikutuksesta siihen, että terminaalia lukeva prosessi saa järjestelmältä paluuarvon EOF, ja ymmärtää syötettävän tiedon loppuneen.&lt;br /&gt;
&lt;br /&gt;
Esimerkiksi komento &lt;br /&gt;
 cat &amp;gt; teksti.txt&lt;br /&gt;
lukee terminaalista käyttäjän syötettä, kunnes annetaan erikoismerkki &amp;lt;tt&amp;gt;^D&amp;lt;/tt&amp;gt;. Tämän jälkeen [[cat]] ymmärtää tiedoston loppuneen, ja käyttäjän syöttämä teksti kirjoitetaan tiedostoon teksti.txt.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Keskustelu:EOF&amp;diff=30749</id>
		<title>Keskustelu:EOF</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Keskustelu:EOF&amp;diff=30749"/>
		<updated>2010-02-16T22:47:31Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: +&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Tiedoston loppu ja loppumerkki==&lt;br /&gt;
Minusta tuntuu, ettei tässä ole tehty selvää eroa tiedoston lopun ja loppumerkin välillä. DOS:ssa CTRL-Z taisi tarkoittaa tietyntyyppisten tiedostojen loppua. Unixissa ei vastaavaa käytäntöä ole, vaan tiedoston loppu on tiedoston loppu.&lt;br /&gt;
&lt;br /&gt;
Sen sijaan merkkiä CTRL-D (ASCII EOT, ”end of transfer”) käytetään ilmaisemaan ”tiedoston” loppua, silloin kun tiedosto syötetään näppäimistöltä tai esimerkiksi hirellä kopioimalla.&lt;br /&gt;
&lt;br /&gt;
Ohjelmoinnissa EOF-tulos todella voi merkitä monta eri asiaa. Niistä voisi ehkä kertoa enemmän, mutta ohjelmoijan on kuitenkin ajateltava niitä perusteellisemmin kuin tässä voi esittää.&lt;br /&gt;
&lt;br /&gt;
--[[Käyttäjä:LP|LP]] 16. helmikuuta 2010 kello 19.02 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Tosiaan, en huomioinut tätä asiaa artikkelia kirjoittaessa. Tässä kuitenkin on luonnollisesti järkevintä käsitellä asioita Linuxin ja Unixin näkökannalta, jolloin ASCII-merkillä 0x04 (EOT) ei ole  varsinaisesti samanlaista erikoismerkitystä silloin kun se luetaan tiedostosta. Lisäsin kuitenkin lähinnä englanninkielisen Wikipedian tietoihin pohjautuen artikkeliin huomautuksen tästä aiheesta. Unixissa Ctrl+Z saa prosessin menemään taustalle, joten sen merkitys on aivan erilainen kuin DOS:issa. --[[Käyttäjä:Ordyh|Ordyh]] 16. helmikuuta 2010 kello 22.46 (UTC)&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Keskustelu:EOF&amp;diff=30748</id>
		<title>Keskustelu:EOF</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Keskustelu:EOF&amp;diff=30748"/>
		<updated>2010-02-16T22:46:35Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: vast.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Tiedoston loppu ja loppumerkki==&lt;br /&gt;
Minusta tuntuu, ettei tässä ole tehty selvää eroa tiedoston lopun ja loppumerkin välillä. DOS:ssa CTRL-Z taisi tarkoittaa tietyntyyppisten tiedostojen loppua. Unixissa ei vastaavaa käytäntöä ole, vaan tiedoston loppu on tiedoston loppu.&lt;br /&gt;
&lt;br /&gt;
Sen sijaan merkkiä CTRL-D (ASCII EOT, ”end of transfer”) käytetään ilmaisemaan ”tiedoston” loppua, silloin kun tiedosto syötetään näppäimistöltä tai esimerkiksi hirellä kopioimalla.&lt;br /&gt;
&lt;br /&gt;
Ohjelmoinnissa EOF-tulos todella voi merkitä monta eri asiaa. Niistä voisi ehkä kertoa enemmän, mutta ohjelmoijan on kuitenkin ajateltava niitä perusteellisemmin kuin tässä voi esittää.&lt;br /&gt;
&lt;br /&gt;
--[[Käyttäjä:LP|LP]] 16. helmikuuta 2010 kello 19.02 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Tosiaan, en huomioinut tätä asiaa artikkelia kirjoittaessa. Tässä kuitenkin on luonnollisesti järkevintä käsitellä asioita Linuxin ja Unixin näkökannalta, jolloin ASCII-merkillä 0x04 (EOT) ei ole  varsinaisesti samanlaista erikoismerkitystä silloin kun se luetaan tiedostosta. Lisäsin kuitenkin lähinnä englanninkielisen Wikipedian tietoihin pohjautuen artikkeliin huomautuksen tästä aiheesta. --[[Käyttäjä:Ordyh|Ordyh]] 16. helmikuuta 2010 kello 22.46 (UTC)&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=EOF&amp;diff=30747</id>
		<title>EOF</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=EOF&amp;diff=30747"/>
		<updated>2010-02-16T22:42:43Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: laajennettu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;EOF&#039;&#039;&#039; eli &#039;&#039;&#039;loppumerkki&#039;&#039;&#039; on C-ohjelmoinnissa ja yleisesti Unix-järjestelmissä tiedoston lopusta kertova erikoismerkki. Kun ohjelma lukee tiedostosta loppumerkin EOF, se tarkoittaa yleensä, että tiedoston loppu on saavutettu, eikä lisää tietoa ole enää saatavilla.&lt;br /&gt;
&lt;br /&gt;
== C-ohjelmoinnissa ==&lt;br /&gt;
C-ohjelman kannalta tiedostot näkyvät [[tiedostokuvain|tiedostokuvaimina]] (engl. &#039;&#039;file descriptor&#039;&#039;). Tiedostokuvaimesta, joka yleensä on liitetty tiedostoon, mutta voi olla liitetty myös johonkin [[standardivirta]]an tai [[putki|putkeen]], voi lukea tavuja standardikirjaston kutsulla &#039;&#039;fgetc()&#039;&#039;. Kutsu palauttaa normaalisti tiedoston seuraavan 8-bittisen merkin, mutta mikäli tiedosto on lopussa tai lukemisessa tapahtuu virhe, kutsu palauttaa erikoisarvon EOF. EOF ei ole positiivinen 8-bittinen kokonaisluku (s.o. luku väliltä 0-255), vaan negatiivinen &#039;&#039;int&#039;&#039; -arvo. Näin mikään tiedosto ei voi sisältää merkkiä EOF, eikä sitä voi tallettaa tyyppiin &#039;&#039;unsigned char&#039;&#039;. Siksi paluuarvo EOF on aina erikoistapaus.&lt;br /&gt;
&lt;br /&gt;
C-ohjelman tulee aina erikseen varmistaa, merkitseekö EOF -paluuarvo todella tiedoston loppua vaiko virhetilannetta kutsulla &#039;&#039;feof()&#039;&#039; tai &#039;&#039;ferror()&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ASCII-loppumerkki 0x04 ==&lt;br /&gt;
Loppumerkkiä läheisesti muistuttaa ASCII-merkki 0x04 (End of Transmission). Vanhoissa järjestelmissä, kuten [[wikipedia:fi:CP/M|CP/M]] järjestelmä talletti jokaisen tiedoston osalta vain sille varattujen talletuslohkojen määrän. Mikäli tiedostoon tallennettu data loppui talletuslohkojen välissä, tiedoston lopusta kertoi erikoismerkki 0x04. Tälläinen tiedosto ei voi tietenkään sisältää muuaalla kontrollimerkkiä 0x04, joka aiheuttaisi vakavia ongelmia nykyisissä järjestelmissä, joiden levyille saatetaan tallettaa mm. salattua tai pakattua binääritietoa. Siksi termillä EOF viitataan nykyisin Linux- ja Unix järjestelmissä useimmiten negatiiviseen lukufunktion paluuarvoon EOF, joka ei voi vastata arvoltaan mitään aitoa merkkiä, esimerkiksi ASCII-kontrollimerkkiä.&lt;br /&gt;
&lt;br /&gt;
== Terminaalissa ==&lt;br /&gt;
Syötteen voi terminaalissa lopettaa antamalla erikoismerkin &amp;lt;tt&amp;gt;^D&amp;lt;/tt&amp;gt;, joka PC-järjestelmissä tapahtuu painamalla Ctrl ja D kirjaimia samaan aikaan.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30746</id>
		<title>Säännöllinen lauseke</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=S%C3%A4%C3%A4nn%C3%B6llinen_lauseke&amp;diff=30746"/>
		<updated>2010-02-16T22:20:09Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: uudelleenkirjoitettu ohjemuotoon&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Säännöllinen lauseke&#039;&#039;&#039; (engl. &#039;&#039;&#039;regular expression&#039;&#039;&#039;, &#039;&#039;&#039;regexp&#039;&#039;&#039;) on yksinkertainen merkkijonokieli, joka voi joko &#039;&#039;vastata&#039;&#039; tai &#039;&#039;olla vastaamatta&#039;&#039; jotain toista merkkijonoa.  Linux- ja Unix-järjestelmissä säännöllisiä lauskkeista on suurta hyötyä [[komentorivi]]ä käytettäessä, mm. komennoissa [[awk]] ja [[grep]]. Niiden voidaankin sanoa olevan [[putki]]ttamiseen yhdistettynä tärkeimpiä työkaluja, joita komentorivin edistynyt käyttö edellyttää.&lt;br /&gt;
&lt;br /&gt;
== Teoriaa ==&lt;br /&gt;
Tietojenkäsittelytieteessä puhutaan [[wikipedia:fi:säännöllinen kieli|säännöllisestä kielestä]], joka voidaan tunnistaa [[wikipedia:fi:äärellinen automaatti|äärellisellä automaatilla]]. Säännöllisiä lausekkeita käytetään myös monissa ohjelmointikielissä (mm. Perl, Java, Python, ECMAScript). Mille tahansa [[wikipedia:en:Turing complete|Turing-täydelliselle]] ohjelmointikielelle voidaan kuitenkin aina kirjoittaa säännöllisten lausekkeiden [[wikipedia:fi:Ohjelmointikielen tulkki|tulkki]].&lt;br /&gt;
&lt;br /&gt;
== Johdatus säännöllisiin lausekkeisiin ==&lt;br /&gt;
&lt;br /&gt;
===Perusteet===&lt;br /&gt;
Säännöllinen lauseke joko &#039;&#039;vastaa&#039;&#039; tai &#039;&#039;ei vastaa&#039;&#039; merkkijonoa. Kutsutaan säännöllistä lauseketta &#039;&#039;lausekkeeksi&#039;&#039; ja merkkijonoa, jonka vastaavuus lausekkeeseen halutaan selvittää, &#039;&#039;kohteeksi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Lausekkeen yksinkertaiset kirjoitusmerkit vastaavat yksi-yhteen kohteen kirjoitusmerkkejä. Tämän vuoksi lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa yllätyksettömästi kohdetta&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei kohdetta&lt;br /&gt;
 bono&lt;br /&gt;
&lt;br /&gt;
Yleensä (mm. grep ja awk) katsotaan, että kohteen alussa ja lopussa voi olla mielivaltainen määrä ei-vastaavia merkkejä. Tällöin kohde (s.o. näiden komentojen tapauksessa &#039;&#039;rivi&#039;&#039;) vastaa lauseketta, jos edes jokin sen &#039;&#039;osa&#039;&#039; vastaa lauseketta. Siis grep ja awk -yhteydessä lauseke&lt;br /&gt;
 abba&lt;br /&gt;
vastaa kohdetta&lt;br /&gt;
 bo&#039;&#039;&#039;abba&#039;&#039;&#039;bo&lt;br /&gt;
ja&lt;br /&gt;
 dada&#039;&#039;&#039;abba&#039;&#039;&#039;gada&lt;br /&gt;
mutta ei silti kohdetta&lt;br /&gt;
 b&#039;&#039;&#039;abb&#039;&#039;&#039;bab&lt;br /&gt;
&lt;br /&gt;
===Operaattorit===&lt;br /&gt;
Yksi-yhteen vastaavien kirjoitusmerkkien lisäksi säännöllisissä lausekkeissa on mahdollisuus käyttää erilaisia &#039;&#039;operaattorimerkkejä&#039;&#039;, joilla on lausekkeessa erikoismerkitys.&lt;br /&gt;
&lt;br /&gt;
====Vaihtoehtoisuusoperaattori: &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Näistä ensimmäinen on operaattori &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;, joka tarkoittaa &#039;&#039;vaihtelua&#039;&#039; tai &#039;&#039;alternointia&#039;&#039; (engl. alternation). Sen merkitys on sama kuin luonnollisen kielen sanalla &amp;quot;tai&amp;quot;. Lauseke&lt;br /&gt;
 omena|luumu&lt;br /&gt;
vastaa sekä kohteita&lt;br /&gt;
 &#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
että&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;&lt;br /&gt;
Kun lisäksi muistamme yltä, että komentorivityökalujen tapauksessa kohde voi sisältää ei-vastaavia merkkejä sekä alussa että lopussa, vastaa ylläoleva lauseke &amp;lt;tt&amp;gt;omena|luumu&amp;lt;/tt&amp;gt; myös merkkijonoja&lt;br /&gt;
 uuni&#039;&#039;&#039;omena&#039;&#039;&#039;&lt;br /&gt;
tai&lt;br /&gt;
 &#039;&#039;&#039;luumu&#039;&#039;&#039;soppa&lt;br /&gt;
Huomaa kuitenkin, että seuraavassa kohteessa vain ensimmäinen esiintymä vastaa lauseketta&lt;br /&gt;
 kotimainen &#039;&#039;&#039;omena&#039;&#039;&#039;-luumuhillo&lt;br /&gt;
&lt;br /&gt;
====Toisto-operaattorit====&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja ilmaisulla &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt; on säännöllisissä lausekkeissa erikoismerkitys, joka vaikuttaa niitä &#039;&#039;välittömästi edeltävään&#039;&#039; merkkiin.&lt;br /&gt;
&lt;br /&gt;
=====Mielivaltaisen monta: &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, tai ei kertaakaan&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab*a&lt;br /&gt;
vastaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
Todettakooon, että selvästi b-merkkien määrä kohteessa voi olla mielivaltainen, joten eri vastaavia kohdemerkkijonoja on olemassa myös ääretön määrä.&lt;br /&gt;
&lt;br /&gt;
=====Vähintään yksi: &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen toistettuna mielivaltaisen monta kertaa, mutta vähintään kerran&amp;quot;&#039;&#039;. Siten lauseke&lt;br /&gt;
 ab+a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;abbbbbbbbbbbbbbbbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abbba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
mutta ei seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====Ehdollinen: &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Operaattori &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tarkoittaa &#039;&#039;&amp;quot;edellinen kerran, tai ei kertaakaan&#039;&#039;&amp;quot;. Siten lauseke&lt;br /&gt;
 ab?a&lt;br /&gt;
vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;aba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;aa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bbbbbbbbbbbbbbbba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;bba&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;ba&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;cccca&lt;br /&gt;
 bba&lt;br /&gt;
&lt;br /&gt;
=====n:stä m:n kertaan: &amp;lt;tt&amp;gt;{n, m}&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Aina yllä olevat operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; eivät riitä, vaan jotain merkkiä tarvitsee vastata juuri tietyn määrän toistoja. Voitaisiin toki kirjoittaa&lt;br /&gt;
 aaaa?a?&lt;br /&gt;
jos halutaan vastata&lt;br /&gt;
 aaa&lt;br /&gt;
 aaaa&lt;br /&gt;
 aaaaa&lt;br /&gt;
mutta voidaan kirjoittaa lyhyemmin&lt;br /&gt;
 a{3,5}&lt;br /&gt;
Tämä tarkoittaa, että edeltävää merkkiä &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; voi esiintyä kolmesta viiteen kertaan. Käytetään yleisesti tästä ilmaisusta mallia &amp;lt;tt&amp;gt;{n,m}&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; ovat mielivaltaisia kokonaislukuja, tarkoittaen &#039;&#039;&amp;quot;n:stä m:n kertaan&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Kumpi tahansa numeroista &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; voidaan jättää pois. Täten ilmaisu&lt;br /&gt;
 {n}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;tasan n kertaa&amp;quot;&#039;. Ilmaisu&lt;br /&gt;
 {n,}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;vähintään n kertaa&amp;quot;&#039;&#039;. Ilmaisu&lt;br /&gt;
 {,m}&lt;br /&gt;
tarkoittaa &#039;&#039;&amp;quot;korkeintaan m kertaa&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Sivuhuomatuksena todettakoon, että yllä olevan perusteella lyhyemmät operaattorit &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; voitaisiin aina korvata ilmaisuilla &amp;lt;tt&amp;gt;{0,}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{1,}&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;{0,1}&amp;lt;/tt&amp;gt; vastaavasti.&lt;br /&gt;
&lt;br /&gt;
===== Huomautuksia =====&lt;br /&gt;
Operaattoreita voi yhdistää mielivaltaisesti toisiinsa. Siten lauseke&lt;br /&gt;
 hur+a*!*&lt;br /&gt;
vastaavaa kaikkia seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;hur&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurra&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurraa!&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hurrraaa!!!!&#039;&#039;&#039;&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Toisaalta lauseke &#039;&#039;ei vastaa&#039;&#039; mitään seuraavista kohteista:&lt;br /&gt;
 burraa!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;aa!!&lt;br /&gt;
 &#039;&#039;&#039;hu&#039;&#039;&#039;uuurraa!!&lt;br /&gt;
 &#039;&#039;&#039;hurr&#039;&#039;&#039;urrur!!&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Tässä vaiheessa on hyvä varmistaa, että ymmärtää edellä esitetyn esimerkin kokonaisuudessaan.&lt;br /&gt;
&lt;br /&gt;
===Sulut: &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Kysymys:&#039;&#039;&#039; Jos halutaan vastata kohdetta &amp;lt;tt&amp;gt;hUrrUrrUrr&amp;lt;/tt&amp;gt; siten, että merkkijono &amp;lt;tt&amp;gt;Urr&amp;lt;/tt&amp;gt; voi esiintyä kohteessa äärettömän monta kertaa, miten tulee toimia?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vastaus:&#039;&#039;&#039; Tämä on mahdotonta tähän mennessä esitetyillä operaattoreilla. Voisimme toki kirjoittaa &amp;lt;tt&amp;gt;hU+r+r+&amp;lt;/tt&amp;gt; tai vastaavaa, mutta tämä vastaisi vain kohteita kuten &amp;lt;tt&amp;gt;hUUrrrr&amp;lt;/tt&amp;gt;. Tarvitsemme selvästi uuden operaattorin; &#039;&#039;sulut&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Merkeillä &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; voidaan määrittää lausekkeen osia, jotka samaan tapaan kuin koulumatematiikassa lasketaan &#039;&#039;ennen&#039;&#039; laskun muita osia. Koska säännöllisissä lausekkeissa ei kuitenkaan lasketa mitään, havainnollistetaan sulkujen merkitystä esittämällä ratkaisu yllä olevaan kysymykseen. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 h(Urr)+&lt;br /&gt;
vastaa kohteita&lt;br /&gt;
 &#039;&#039;&#039;hUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hUrrUrrUrrUrr&#039;&#039;&#039;&lt;br /&gt;
jne. jne. Lauseke ei vastaa seuraavia kohteita:&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Arr&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;Err&lt;br /&gt;
 burr&lt;br /&gt;
&lt;br /&gt;
Samoin kohde &lt;br /&gt;
 &#039;&#039;&#039;hUr&#039;&#039;&#039;&lt;br /&gt;
näyttää oikealta, mutta jää kuitenkin liian lyhyeksi, sillä sulkujen sisältö on löydyttävä kohteesta aina &#039;&#039;kokonaan&#039;&#039;. Siksi kohde &amp;lt;tt&amp;gt;hUr&amp;lt;/tt&amp;gt; &amp;lt;u&amp;gt;ei&amp;lt;/u&amp;gt; vastaa lauseketta &amp;lt;tt&amp;gt;h(Urr)+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Esimerkkejä====&lt;br /&gt;
&lt;br /&gt;
Sulkuja voi yhdistellä mielivaltaisesti kaikkiin operaattoreihin &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;|&amp;lt;/tt&amp;gt;. Seuraavassa on annettu sarja lausekkeita, sekä esimerkkejä kutakin vastaavista ja vastaamattomista kohteista:&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 d(ii)?pada+(pa|ba)?&lt;br /&gt;
vastaa esimerkiksi seuraavia kohteita&lt;br /&gt;
 &#039;&#039;&#039;diipadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;dpadaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaapa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaaaba&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipada&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaa&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;diipadaaaa&#039;&#039;&#039;&lt;br /&gt;
mutta ei mitään seuraavista&lt;br /&gt;
 &#039;&#039;&#039;di&#039;&#039;&#039;padaapa&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;uu&lt;br /&gt;
 &#039;&#039;&#039;diipad&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Viimeinen esimerkki jää lyhyeksi, sillä merkki &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; on lausekkeessa pakollinen vähintään kerran.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (hi|ha|ho)+&lt;br /&gt;
vastaa mitä tahansa kohdetta, jossa esiintyy mikä tahansa määrä merkkijonoja &amp;lt;tt&amp;gt;hi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ha&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;ho&amp;lt;/tt&amp;gt; peräkkäin mielivaltaisen monta kertaa, kuitenkin vähintään kerran. Lauseke vastaa siis kaikkia seuraavia:&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;haha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hiha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hoho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihaho&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hahohihohahi&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;e&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;u&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;uhu&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;ehe&lt;br /&gt;
&lt;br /&gt;
===Yhtä merkkiä vastaavat erikoismerkit===&lt;br /&gt;
Säännöllisissä lausekkeissa voi esiintyä myös joitain erikoismerkkejä, jotka eivät ole operaattoreita, eli ne eivät vaikuta niitä edeltäviin sulkuihin tai merkkeihin. Ne voitaisiin aina kirjoittaa lausekkeilla muotoa&lt;br /&gt;
 (merkki1|merkki2|merkki3|merkki4|...|merkkiN)&lt;br /&gt;
mutta tämä on varsin työlästä ja epäselkeää. Siksi säännöllisissä lausekkeissa on joitain erikoismerkkejä, jotka ovat oikopolkuja monimutkaisten vaihtoehtoisuuslausekkeiden kirjoittamiseen.&lt;br /&gt;
&lt;br /&gt;
====Jokerimerkki: &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Merkillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; (piste) on erikoismerkitys. Se vastaa aina &#039;&#039;mitä tahansa&#039;&#039; merkkiä. Lauseke&lt;br /&gt;
 .*&lt;br /&gt;
vastaa siis kaikkia mahdollisia kohteita - jopa tyhjää merkkijonoa, sillä operaattori &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; tarkoittaa, että erikoisoperaattori &amp;quot;mikä tahansa merkki&amp;quot; voi esiintyä myös nolla kertaa. &lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 (h.)+&lt;br /&gt;
vastaa siten kaikkia seuraavista:&lt;br /&gt;
 &#039;&#039;&#039;ha&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;he&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hi&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hy&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hihrhy&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 rh&lt;br /&gt;
 ah&lt;br /&gt;
 oh&lt;br /&gt;
 ih&lt;br /&gt;
 &#039;&#039;&#039;h&#039;&#039;&#039;&lt;br /&gt;
Viimeinen esimerkki jää jälleen lyhyeksi, sillä &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt; ei vastaa kuitenkaan &amp;quot;tyhjää&amp;quot; merkkiä.&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 .upu&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
mutta myös&lt;br /&gt;
 &#039;&#039;&#039;supu&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 sepe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Merkkiluokat: &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan korjata ylläoleva Ankanpoika-esimerkki, voitaisiin kirjoittaa:&lt;br /&gt;
 (t|h|l|T|H|L)upu&lt;br /&gt;
joka vastaisi vain ja ainoastaan:&lt;br /&gt;
 &#039;&#039;&#039;tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;lupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Tupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Hupu&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Lupu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Merkkien &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; avulla voidaan määritellä kirjainluokkia siten, että seuraava merkki kohteessa vastaa vain ja ainoastaan jotain hakasulkujen välissä olevaa kirjainta. Siten äskeistä täysin vastaa lauseke on&lt;br /&gt;
 [thlTHL]upu&lt;br /&gt;
&lt;br /&gt;
Hakasulkujen välissä voidaan myös määritellä aakkoston mukaisia välejä väliviivalla &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;. Tällöin &lt;br /&gt;
 19[4-9][0-9]|20[0-9][0-9]&lt;br /&gt;
vastaa kaikkia vuosilukuja välillä 1940-2099. Samoin &lt;br /&gt;
 Osasto [A-I]&lt;br /&gt;
vastaa &lt;br /&gt;
 &#039;&#039;&#039;Osasto A&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto B&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto C&#039;&#039;&#039;&lt;br /&gt;
 ...&lt;br /&gt;
 &#039;&#039;&#039;Osasto H&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Osasto I&#039;&#039;&#039;&lt;br /&gt;
mutta ei&lt;br /&gt;
 &#039;&#039;&#039;Osasto &#039;&#039;&#039;J&lt;br /&gt;
&lt;br /&gt;
Jos merkki &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; halutaan sisällyttää hakasulkuilmaisuun, se jätetään viimeiseksi. Esim.&lt;br /&gt;
 Ala[ -]aste&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;Ala aste&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;Ala-aste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Jos oikea hakasulku (&amp;lt;tt&amp;gt;]&amp;lt;/tt&amp;gt;) halutaan sisällyttää hakasulkuilmaukseen, se laitetaan hakasulkujen ensimmäiseksi merkiksi. Esim.&lt;br /&gt;
 []abcdef]+&lt;br /&gt;
vastaa&lt;br /&gt;
 &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;b&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;ab]&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;d]f&#039;&#039;&#039;&lt;br /&gt;
jne., mutta ei&lt;br /&gt;
 [gi&lt;br /&gt;
 zo&lt;br /&gt;
&lt;br /&gt;
Hakasulkuilmaisusn merkitys voidaan kääntää asettamalla hattu &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; sen ensimmäiseksi merkiksi. Tällöin hakasulkuilmaisu vastaa mitä tahansa hakasuluissa &amp;lt;u&amp;gt;&#039;&#039;&#039;ei&#039;&#039;&#039;&amp;lt;/u&amp;gt; esiintyvää merkkiä kohteessa. Täten lauseke&lt;br /&gt;
 [^aeiouyåäö]+&lt;br /&gt;
vastaa mitä tahansa pelkistä konsonanteista, välimerkeistä ja numeroista koostuvaa kohdetta, kuten&lt;br /&gt;
 &#039;&#039;&#039;prrr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;123&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;hkr&#039;&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;brr-hrr&#039;&#039;&#039;&lt;br /&gt;
jne. Mutta ei&lt;br /&gt;
 au&lt;br /&gt;
 aiai&lt;br /&gt;
jne.&lt;br /&gt;
&lt;br /&gt;
Grepin hyväksymissä säännöllisissä lausekkeissa merkin &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; voi sisällyttää hakasulkuilmaukseen laittamalla sen miksi tahansa muuksi merkiksi, kuin hakasulkujen ensimmäinen merkki. Tämä ei pidä välttämättä paikkaansa kuitenkaan kaikilla säännöllisten lausekkeiden toteutuksilla, vaan hattumerkin eteen on mahdollisesti laitettava pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Pako-operaattori: &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;====&lt;br /&gt;
Jos halutaan vastata jotain merkkiä, joka on määritelty operaattoriksi säännöllisissä lausekkeissa, sitä ei voida kirjoittaa sellaisenaan lausekkeeseen. Jos halutaan vastata tarkalleen jotain seuraavista&lt;br /&gt;
 Mitä?&lt;br /&gt;
 Missä?&lt;br /&gt;
 Milloin?&lt;br /&gt;
ei voida kirjoittaa lauseketta&lt;br /&gt;
 (Mi(tä|ssä|lloin))?&lt;br /&gt;
koska kysymysmerkki &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; lopussa vain ehdollista koko ulomman sulkuilmaisun, ja koko lauseke vastaisi siis vain joko tyhjää merkkijonoa tai kysymysmerkitöntä kysymyssanaa.&lt;br /&gt;
&lt;br /&gt;
Tarvitaan pako-operaattoria &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;. Merkin &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; tai ylipäänsä minkä tahansa opraattorimerkin erikoismerkityksen voi poistaa asettamalla sen eteen kenoviivan. Tällöin kenoviivaa välittömästi seuraava merkki täytyy esiintyä kohteessa sellaisenaan. Oikea tapa kirjoittaa yllä oleva lauseke olisi siten&lt;br /&gt;
 (Mi(tä|ssä|lloin))\?&lt;br /&gt;
Tämä vastaa vain ja ainoastaan haluttuja merkkijonoja.&lt;br /&gt;
&lt;br /&gt;
Seuraavat operaattorit on merkittävä pako-operaattorilla, jos niitä ei haluta tulkittavan erikoismerkeiksi:&lt;br /&gt;
 ( ) | * + ? { } [ ] ^ $ \&lt;br /&gt;
&lt;br /&gt;
Siis, jos halutaan vastata kohteessa kenoviivaa, on kirjoitettava &amp;lt;tt&amp;gt;\\&amp;lt;/tt&amp;gt;. Esimerkiksi Windows-polku:&lt;br /&gt;
 &#039;&#039;&amp;lt;asema&amp;gt;&#039;&#039;:\Dokumentit\&#039;&#039;&amp;lt;nimi&amp;gt;&#039;&#039;.(doc, docx tai odt)&lt;br /&gt;
voidaan löytää esim. seuraavalla säännöllisellä lausekkeella:&lt;br /&gt;
 [A-Z]:\\Dokumentit\\[a-öA-Ö0-9 _-]+\.(doc|docx|odt)&lt;br /&gt;
&lt;br /&gt;
=== Rivin alku ja loppu: &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;===&lt;br /&gt;
On voinut herätä kysymys, kuinka voidaan vastata kohdetta (s.o. riviä) &#039;&#039;tarkalleen&#039;&#039;. Heti alussa selvisi, että esim grepin mielestä kohde (rivi) vastaa lauseketta, jos lauseke esiintyy missä tahansa kohdassa riviä. Jos halutaan, että lauseke vastaa alusta loppuun tarkalleen koko riviä, on otettava käyttöön erikoismerkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;. Nämä vastaavat kohteessa rivin tai merkkijonon alkua ja loppua kuvaavia &amp;quot;näkymättömiä&amp;quot; merkkejä vastaavasti. Siten&lt;br /&gt;
 ^abba$&lt;br /&gt;
vastaa vain riviä&lt;br /&gt;
 &#039;&#039;&#039;abba&#039;&#039;&#039;&lt;br /&gt;
mutta ei esimerkiksi&lt;br /&gt;
 babba&lt;br /&gt;
 abbab&lt;br /&gt;
 babbab&lt;br /&gt;
 &#039;&#039;&#039;ab&#039;&#039;&#039;a&lt;br /&gt;
 &#039;&#039;&#039;abb&#039;&#039;&#039;bba&lt;br /&gt;
&lt;br /&gt;
==== Esimerkki ====&lt;br /&gt;
&lt;br /&gt;
Merkit &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt; antavat viimeisen silauksen grepin tehokkaaseen hyödyntämiseen. Nyt esimerkiksi, jos tulostetaan kaikki [[prosessi]]t komennolla &amp;lt;tt&amp;gt;[[ps]] -ef&amp;lt;/tt&amp;gt;, saadaan yleensä jokseenkin tälläinen listaus (esimerkissä palvelinkone):&lt;br /&gt;
 &lt;br /&gt;
 $ ps -ef&lt;br /&gt;
 UID        PID  PPID  C STIME TTY          TIME CMD&lt;br /&gt;
 root         1     0  0 Jan21 ?        00:00:34 init [2]      &lt;br /&gt;
 root      1425     1  0 Jan31 ?        00:00:00 /usr/sbin/xinetd&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
 root      5566     1  0 Jan21 ?        00:00:05 /usr/sbin/apache2 -k start&lt;br /&gt;
 root      6091     1  0 Jan21 ?        00:00:03 /usr/sbin/cron&lt;br /&gt;
 www-data 15379  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 www-data 15386  5566  0 Feb14 ?        00:00:00 /usr/sbin/apache2 -k start&lt;br /&gt;
 root     21684 32395  0 20:37 ?        00:00:00 sshd: user [priv]&lt;br /&gt;
 user     21688 21684  0 20:37 ?        00:00:00 sshd: user@pts/1&lt;br /&gt;
 user     21689 21688  0 20:37 pts/1    00:00:00 -bash&lt;br /&gt;
 user     21705 21689  0 20:37 pts/1    00:00:00 ps -ef&lt;br /&gt;
 syslog   32279     1  0 Jan21 ?        00:00:07 /sbin/syslogd -u syslog&lt;br /&gt;
 bind     32351     1  0 Jan31 ?        00:00:00 /usr/sbin/named&lt;br /&gt;
 root     32395     1  0 Jan21 ?        00:00:22 /usr/sbin/sshd&lt;br /&gt;
 (... jne ...)&lt;br /&gt;
&lt;br /&gt;
Jos haluamme ylläolevasta listasta vain &amp;quot;qmail&amp;quot; -alkuisten [[käyttäjä|käyttäjien]] prosessit, voisimme kirjoittaa&lt;br /&gt;
 ps -ef | grep qmail&lt;br /&gt;
Tämä kuitenkin tulostaa myös kaikki sellaiset prosessit, joiden nimikentässä esiintyy &amp;quot;qmail&amp;quot; – joukossa myös käyttäjän [[root]] prosesseja vastoin alkuperäistä tarkoitusta:&lt;br /&gt;
 $ ps -ef | grep qmail&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 root      3993  3986  0 Jan21 ?        00:00:00 qmail-lspawn | /usr/bin/deliverquota ./Maildir&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Ratkaisu qmail -alkuisten käyttäjien prosessien listaamiseen on:&lt;br /&gt;
 $ ps -ef | grep ^qmail.&lt;br /&gt;
 qmails    3986     1  0 Jan21 ?        00:00:00 qmail-send&lt;br /&gt;
 qmaill    3990  3986  0 Jan21 ?        00:00:00 splogger qmail 2&lt;br /&gt;
 qmailr    3994  3986  0 Jan21 ?        00:00:00 qmail-rspawn&lt;br /&gt;
 qmailq    3995  3986  0 Jan21 ?        00:00:00 qmail-clean&lt;br /&gt;
&lt;br /&gt;
Hattumerkki &amp;lt;tt&amp;gt;^&amp;lt;/tt&amp;gt; alussa vastaa jokaisen listausrivin alkua, jota pitää välittömästi seurata merkkijono &amp;lt;tt&amp;gt;qmail&amp;lt;/tt&amp;gt;, ja tämän jälkeen voi tulla mikä tahansa merkki (ilmaisu &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;). Grep tulostaa vain lausketta vastaavat rivit, ja tulos on haluttu.&lt;br /&gt;
&lt;br /&gt;
===== Pako komentotulkista =====&lt;br /&gt;
Jos halutaan antaa jokin monimutkaisempi ilmaisu, on hyvä asettaa säännöllinen lauseke yksinkertaisten heittomerkkien &amp;lt;tt&amp;gt;&#039;&amp;lt;/tt&amp;gt; sisään, jotta ne regexp-operaattorit, joillla on jokin erikoismerkitys [[komentotulkki|komeotulkissa]] eivät aiheuta ongelmia.&lt;br /&gt;
 $ echo moi | egrep m(o|a)i&lt;br /&gt;
 -bash: syntax error near unexpected token `(&#039;&lt;br /&gt;
Sululla &amp;lt;tt&amp;gt;(&amp;lt;/tt&amp;gt; on erikoismerkitys komentotulkissa, samoin merkillä &amp;lt;tt&amp;gt;[[putki||]]&amp;lt;/tt&amp;gt;. Ratkaisu:&lt;br /&gt;
 $ echo moi | egrep &#039;m(o|a)i&#039;&lt;br /&gt;
 moi&lt;br /&gt;
Esimerkissä käytettiin komentoa egrep. Se on oikopolku grepin [[valitsin|valitsimelle]] &amp;lt;tt&amp;gt;-E&amp;lt;/tt&amp;gt;, joka ottaa säännöllisten lausekkeiden laajennetun tuen käyttöön. Normaalissa käytössä (pelkkö komento &amp;lt;tt&amp;gt;grep&amp;lt;/tt&amp;gt;) operaattorit &amp;lt;tt&amp;gt;? + {} | (&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;)&amp;lt;/tt&amp;gt; eivät ole käytettävissä, paitsi asettamalla niiden eteen pako-operaattori &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Jos ylläolevassa prosessilistausesimerkissä halutaan tulostaa pelkät prosessien [[PID]]-numerot, voidaan käyttää [[awk]]-työkalua seuraavasti:&lt;br /&gt;
 $ ps -ef | awk &#039;/^qmail./ { print $2 }&#039;&lt;br /&gt;
 3986&lt;br /&gt;
 3990&lt;br /&gt;
 3994&lt;br /&gt;
 3995&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä lausekkeista ==&lt;br /&gt;
Web-kuva:&lt;br /&gt;
 [^ ]+\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)&lt;br /&gt;
Päivämäärä muotoa pp.kk.vvvv:&lt;br /&gt;
 [0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}&lt;br /&gt;
2-merkkinen [[wikipedia:fi:heksadesimaalijärjestelmä|heksadesimaali]]:&lt;br /&gt;
 [0-9A-Fa-f]{2}&lt;br /&gt;
Sähköpostiosoite:&lt;br /&gt;
 [a-zA-Z0-9_]+@[a-zA-Z0-9_\.]+\.[a-zA-Z]{2,3}&lt;br /&gt;
&lt;br /&gt;
== Laajennukset ==&lt;br /&gt;
Yllä esitetty on hyvä lähtökohta säännöllisiin lausekkeisiin, ja kaikki modernit [[POSIX]]-yhteensopivat toteutukset tukevat mainittuja operaattoreita ja erikoismerkkejä. Monissa ohjelmointikielissä on tehty laajennuksia tähän, mutta esim. [[grep]] ei tue seuraavia. &lt;br /&gt;
&lt;br /&gt;
=== Pakoluokat ===&lt;br /&gt;
Jos halutaan kirjoittaa lause, joka jossain kohtaa vastaa mitä tahansa numeromerkkiä, voidaan kirjoittaa hakasulkuilmaus &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;. Tälläisille yleisesti käytetyille luokille on kuitenkin olemassa laajennuksissa helpompia nimiä. Kutsutaan näitä pakoluokiksi.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-style: solid; border-collapse: collapse&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+&#039;&#039;&#039;Pakoluokat&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Ilmaisu !! Merkitys !! Vastaava hakasulkuilmaus&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; || Mikä tahansa kirjain, numero tai alaviiva. || &amp;lt;tt&amp;gt;[a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\W&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa muu kuin kirjain, numero tai alaviiva. || &amp;lt;tt&amp;gt;[^a-zA-Z0-9_]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; || Mikä tahansa tyhjä merkki (esim. välilyönti tai tabulaattori) || esim. &amp;lt;tt&amp;gt;[ \t]&amp;lt;/tt&amp;gt;, jossa &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; tabulaattorimerkki&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-tyhjä merkki || esim. &amp;lt;tt&amp;gt;[^ \t]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; || Mikä tahansa numero. || &amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;\D&amp;lt;/tt&amp;gt; || Äskeisen vastakohta; mikä tahansa ei-numero. || &amp;lt;tt&amp;gt;[^0-9]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Lauseke&lt;br /&gt;
 \d+&lt;br /&gt;
vastaa siis kaikkia numeroita aivan siinä missä myös&lt;br /&gt;
 [0-9]+&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Grep]] ja [[Awk]]&lt;br /&gt;
** [[Putki]]&lt;br /&gt;
* [[Ed]] ja [[Sed]]: tuki säännöllisille lausekkeille&lt;br /&gt;
* [[Vi]] ja [[vim]]: näiden graaffinen tila&lt;br /&gt;
* [[Emacs]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[[wikipedia:fi:säännöllinen lauseke|Säännöllinen lauseke]]&lt;br /&gt;
*[[wikipedia:fi:äärellinen automaatti|Äärellinen automaatti]]&lt;br /&gt;
*[[wikipedia:fi:pinoautomaatti|Pinoautomaatti]]&lt;br /&gt;
*[[wikipedia:fi:turingin kone|Turingin kone]]&lt;br /&gt;
*[http://www.ohjelmointiputka.net/opas.php?tunnus=phpsl Säännölliset lausekkeet PHP:ssä] -opas Ohjelmointiputkassa&lt;br /&gt;
*[http://swtch.com/~rsc/regexp/regexp1.html Regular Expression Matching Can Be Simple And Fast]: Keskustelua säännöllisten lausekkeiden toteutuksesta C-kielellä englanniksi.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Locale&amp;diff=30738</id>
		<title>Locale</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Locale&amp;diff=30738"/>
		<updated>2010-02-16T12:12:58Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: /* Käyttö */ tark.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Locale on [[komentorivi]]ohjelma, joka tulostaa kieltä ja muita alueellisia tietoja koskevat [[ympäristömuuttuja]]t ja näyttää asennetut lokaalivaihtoehdot.&lt;br /&gt;
&lt;br /&gt;
Lokaliin liittyvät muuttujat määräävät ”[[kotoistus|kansainvälistetyn]]” ohjelman käyttämän kielen ja kieleen ja kulttuuriin liittyvät käytännöt, esimerkiksi päivämäärien muodon, desimaalierottimen ja aakkosjärjestyksen.&lt;br /&gt;
&lt;br /&gt;
Kaikissa ohjelmissa ei hyödynnetä kaikkia vivahteita. Jos osaa ohjelmasta ei ole käännetty käytetään siltä osin alkuperäistä (englannin) kieltä. Joissakin ohjelmissa käytetään näitten muuttujien sijaan ohjelman valikoita tai muita asetuksia.&lt;br /&gt;
&lt;br /&gt;
==Käyttö==&lt;br /&gt;
Tulostetaan kieli- ja aluemuuttujien tiedot:&lt;br /&gt;
 kayttaja@kone:~$ locale&lt;br /&gt;
 LANG=en_GB.utf8&lt;br /&gt;
 LC_CTYPE=&amp;quot;en_GB.utf8&amp;quot;&lt;br /&gt;
 LC_NUMERIC=&amp;quot;en_GB.utf8&amp;quot;&lt;br /&gt;
 LC_TIME=&amp;quot;en_GB.utf8&amp;quot;&lt;br /&gt;
 LC_COLLATE=&amp;quot;en_GB.utf8&amp;quot;&lt;br /&gt;
 LC_MONETARY=&amp;quot;en_GB.utf8&amp;quot;&lt;br /&gt;
 LC_MESSAGES=&amp;quot;en_GB.utf8&amp;quot;&lt;br /&gt;
 LC_PAPER=&amp;quot;en_GB.utf8&amp;quot;&lt;br /&gt;
 LC_NAME=&amp;quot;en_GB.utf8&amp;quot;&lt;br /&gt;
 LC_ADDRESS=&amp;quot;en_GB.utf8&amp;quot;&lt;br /&gt;
 LC_TELEPHONE=&amp;quot;en_GB.utf8&amp;quot;&lt;br /&gt;
 LC_MEASUREMENT=&amp;quot;en_GB.utf8&amp;quot;&lt;br /&gt;
 LC_IDENTIFICATION=&amp;quot;en_GB.utf8&amp;quot;&lt;br /&gt;
 LC_ALL=en_GB.utf8&lt;br /&gt;
&lt;br /&gt;
Lokaalit ovat muotoa &amp;lt;tt&amp;gt;kieli_ALUE.merkistö&amp;lt;/tt&amp;gt;. Lokaali &amp;lt;tt&amp;gt;eb_GB.utf8&amp;lt;/tt&amp;gt; tarkoittaa siis englanninkielen brittiversiota [[UTF-8]] -merkistöllä koodattuna.&lt;br /&gt;
&lt;br /&gt;
Tulostetaan asennetut lokaalit (joskus &#039;&#039;hyvin&#039;&#039; pitkä lista, tässä erään järjestelmän oletusvalikoima: eri englannin muunnelmia sekä [[C]]- ja [[POSIX]]-oletuslokaalit):&lt;br /&gt;
 kayttaja@kone:~$ locale -a&lt;br /&gt;
 C&lt;br /&gt;
 en_AU.utf8&lt;br /&gt;
 en_BW.utf8&lt;br /&gt;
 en_CA.utf8&lt;br /&gt;
 en_DK.utf8&lt;br /&gt;
 en_GB.utf8&lt;br /&gt;
 en_HK.utf8&lt;br /&gt;
 en_IE.utf8&lt;br /&gt;
 en_IN&lt;br /&gt;
 en_NZ.utf8&lt;br /&gt;
 en_PH.utf8&lt;br /&gt;
 en_SG.utf8&lt;br /&gt;
 en_US.utf8&lt;br /&gt;
 en_ZA.utf8&lt;br /&gt;
 en_ZW.utf8&lt;br /&gt;
 POSIX&lt;br /&gt;
&lt;br /&gt;
Tulostetaan asennetut suomenkieliset lokaalit (jotka yleensä alkavat kielikoodilla ”fi”, tässä [[Debian]]):&lt;br /&gt;
 kayttaja@kone:~$ locale -a | [[grep]] &amp;quot;^fi&amp;quot;&lt;br /&gt;
 fi_FI&lt;br /&gt;
 fi_FI@euro&lt;br /&gt;
 fi_FI.iso88591&lt;br /&gt;
 fi_FI.iso885915@euro&lt;br /&gt;
 fi_FI.utf8&lt;br /&gt;
 fil_PH&lt;br /&gt;
 fil_PH.utf8&lt;br /&gt;
 finnish&lt;br /&gt;
&lt;br /&gt;
Tähän eksyi näköjään mukaan filipino.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;fi&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;fi_FI&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;finnish&amp;lt;/tt&amp;gt; viittaavat (vrt. [[locale.alias]]) johonkin suomi-lokaaliin. Nykyään suositeltava suomi-lokaali on yleensä [[Unicode]]a käyttävä &amp;lt;tt&amp;gt;fi_FI.[[UTF-8|utf8]]&amp;lt;/tt&amp;gt;. Yhteensopivuussyistä vanhemmat merkistöjä ISO-8859-1 ja -15 käyttävät lokaalit voivat joskus olla paremmat.&lt;br /&gt;
&lt;br /&gt;
Saame:&lt;br /&gt;
 kayttaja@kone:~$ locale -a | grep &amp;quot;^se&amp;quot;&lt;br /&gt;
 se_NO&lt;br /&gt;
 se_NO.utf8&lt;br /&gt;
&lt;br /&gt;
Kaikki Suomi-lokaalit:&lt;br /&gt;
 kayttaja@kone:~$ locale -a | grep &amp;quot;_FI&amp;quot; | [[less]]&lt;br /&gt;
&lt;br /&gt;
==Ympäristömuuttujat==&lt;br /&gt;
&lt;br /&gt;
Haluttua locale-ympäristöä voi säätää joukolla ympäristömuuttujia (katso yllä). Näistä erityisen kiinnostavia ovat seuraavat:&lt;br /&gt;
&lt;br /&gt;
*LC_CTYPE: käytettävä merkistö, merkkien luokittelu sekä pienten ja isojen kirjainten vastaavuus&lt;br /&gt;
*LC_COLLATE aakkosjärjestys&lt;br /&gt;
*LC_MESSAGES: ohjelmien viestien kieli; jos käännös puuttuu viesti näytetään alkuperäisellä kielellä (käytännössä englanniksi)&lt;br /&gt;
*LANG: oletusympäristö&lt;br /&gt;
*LANGUAGE: [[GNU]]-projektin LANG-muuttuja, hyväksyy listan eri vaihtoehdoista&lt;br /&gt;
*LC_ALL: käytettävä ympäristö muista locale-muuttujista välittämättä&lt;br /&gt;
&lt;br /&gt;
==Lokaalien generointi==&lt;br /&gt;
&lt;br /&gt;
Kotikoneilla harvemmin on tarvetta tukea maailman kaikkia kieliä ja kulttuureja. Tilan säästämiseksi lokaaleja generoidaan usein käytettäviksi vain pyynnöstä. C ja POSIX (eli [[C]]-kielen ja [[POSIX]]-standardin oletuslokaalit, käytännössä samat) ovat aina käytössä, usein oletusarvoisesti liuta englanninkielisiä lokaaleja sekä asennuksessa valittu järjestelmän oletuskieli. Tuen saamiseksi muut halutut lokaalit pitää generoida. Tapa vaihtelee jakelusta toiseen.&lt;br /&gt;
&lt;br /&gt;
Debianissa käytetään asetustiedostoa &amp;lt;tt&amp;gt;/etc/[[locale.gen]]&amp;lt;/tt&amp;gt;, jossa tarpeettomat lokaalit on muunnettu ”kommenteiksi” #-merkillä. Tämä merkki poistetaan halutuilta riveiltä ja sen jälkeen annetaan komento&lt;br /&gt;
 root@kone# [[locale-gen]]&lt;br /&gt;
Tämä ohjelma ajaa [[localedef]]-ohjelman jokaisen halutun lokaalin generoimiseksi.&lt;br /&gt;
&lt;br /&gt;
Vastaavan voi myös tehdä komennolla&lt;br /&gt;
 root@kone# [[dpkg-reconfigure]] locales&lt;br /&gt;
&lt;br /&gt;
==Lokaalin asettaminen==&lt;br /&gt;
Lokaalin voi asettaa tiettyyn arvoon [[komentotulkki|komentotulkista]] riippuen (esimerkiksi) komennolla&lt;br /&gt;
 [[export]] LANG=fi_FI.utf8&lt;br /&gt;
tai&lt;br /&gt;
 [[setenv]] LANG fi_FI.utf8&lt;br /&gt;
&lt;br /&gt;
Edellinen toimii mm [[bash]]issa ja [[zsh]]:ssa, jälkimmäinen [[csh]]-sukuisissa tulkeissa. Komento voi olla hyvä lisätä komentotulkin käynnistys[[skripti]]in ([[bashrc]], [[zsh|zshrc]], [[tcsh|tcshrc]] ym), mikäli haluaa asetuksen pysyvän jatkuvasti voimassa.&lt;br /&gt;
&lt;br /&gt;
Käyttämällä LANG-muuttujaa yksittäiset arvot voi asettaa toisenlaisiksi, esimerkiksi virheviestit alkukielellä (englanniksi) ja aakkostaminen perinteiseen tapaan jossa 00INDEX.txt ja README hakemistolistauksen alussa:&lt;br /&gt;
 [[export]] LC_MESSAGES=C LC_COLLATE=C&lt;br /&gt;
&lt;br /&gt;
Käyttämällä muuttujaa LC_ALL näiden muiden muuttujien arvot jätetään huomiotta, mikä on kätevää esimerkiksi yksittäisen komennon ajamiseksi oletusympäristössä tai aiotussa oletusympäristössä:&lt;br /&gt;
 [[env]] LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
*[[Lokalisointi]]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Komentorivin perustyökalut]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Unicode&amp;diff=30737</id>
		<title>Unicode</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Unicode&amp;diff=30737"/>
		<updated>2010-02-16T12:12:13Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: wikilink&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{perustietoa}}&lt;br /&gt;
[[wikipedia:fi:Unicode|Unicode Wikipediassa]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unicode&#039;&#039;&#039; on standardi, joka muun muassa määrittelee useimmille maailman kirjoitusmerkeille omat merkkikoodinsa. Standardin tarkoituksena on korvata tähän saakka käytössä olleet hyvin erilaiset ja keskenään huonosti yhteensopivat merkistöt. Suomessa on Linux-koneissa käytetty enimmäkseen ISO-8859-15-merkistöä. Vanhojen merkistöjen ongelma on, että niiden merkkivalikoima on hyvin rajallinen, esimerkiksi 256 merkkiä. Se yleensä tarkoittaa, että samalla merkistöllä ei voida esittää useita kovin erilaisia kieliä. Esimerkiksi sama tekstitiedosto tai sähköpostiviesti ei voi sisältää tekstiä kuin niillä kielillä, joita kyseisellä merkistöllä voidaan esittää. Tämä ei kenties häiritse yksittäistä tietokoneenkäyttäjää, mutta sitä mukaa, kun kansainvälinen tietoliikenne on lisääntynyt, on myös lisääntynyt tarve luoda kaikille yhteinen standardi kirjoitusmerkkien esittämiseksi.&lt;br /&gt;
&lt;br /&gt;
Unicode pyrkii ratkaisemaan vanhojen merkistöjen rajallisuuteen liittyvät ongelmat luomalla merkistön, joka sisältää kaikki nykyiset (ja jopa entiset) kirjoitusjärjestelmät. Unicode-standardi käsittää 1 114 112 merkkipaikkaa, ja ne yksilöidään U+xxxx-muotoisella tunnuksella, jossa ”xxxx” on merkin numerokoodi heksadesimaalimuodossa (16-järjestelmä). Mahdolliset koodit ovat U+0000..U+10FFFF. Käytännössä ihan jokainen merkkipaikka ei viittaa mihinkään kirjoitusmerkkiin, vaan mukana on jonkin verran myös erilaisia ohjauskoodeja tietokonetta varten sekä Unicode-standardiin liittyvää erikoistietoa. Joka tapauksessa merkkipaikkoja on niin paljon, että kaikki olemassa olevat ja jo historiaan jääneet kirjoitusmerkit mahtuvan mukaan. Tästä huolimatta merkkipaikkoja on runsaasti tyhjillään tulevaisuuden varalta ja kaikkia tuskin tarvitaan koskaan. Mukana on myös suuri joukko tarkoituksella määrittelemättömiä, yksityiseen käyttöön varattuja merkkipaikkoja.&lt;br /&gt;
&lt;br /&gt;
Unicode-merkkejä sisältävää tekstiä voidaan tallentaa tietokoneelle useilla eri tavoilla. Linuxissa ja yleensäkin tietoliikenteessä käytetty Unicoden koodaustapa on nimeltään &#039;&#039;&#039;[[UTF-8]]&#039;&#039;&#039;. Tässä koodauksessa yksi Unicode-merkki vie tallennustilaa 1–4 oktettia eli 8 bitin tavua. ASCII-merkistöön kuuluvat merkit (U+0000..U+007F) esitetään UTF-8:ssa sellaisenaan, yhtenä tavuna, joten ASCII on täysin UTF-8-yhteensopiva. Se onkin Linuxissa tärkeää, koska siinä käytetään paljon ASCII-muodossa olevia asetustiedostoja ja käynnistysskriptejä. Muiden kuin ASCII-merkkien esittämiseksi tarvitaan avuksi lisätavuja, ja esimerkiksi suomen kieleen kuuluvien ä- ja ö-kirjainten esittämiseen tarvitaan kaksi tavua.&lt;br /&gt;
&lt;br /&gt;
UTF-8:n lisäksi on olemassa muitakin koodaustapoja, esimerkiksi UTF-16 ja UTF-32. UTF-16:ssa merkit esitetään joko yhtenä 16-bittisenä lukuna, tai mikäli merkin koodi on sitä suurempi, niin kahden 16-bittisen luvun muodostamana nk. sijaismerkkiparina (surrogate pair). UTF-32:ssa merkki esitetään aina yhtenä 32-bittisenä lukuna. Kuten todettu, Linuxissa käytetään pääasiassa UTF-8:aa. Ohjelmat voivat kuitenkin sisäisesti käyttää muitakin koodaustapoja, ja ohjelmien tekijät voivat vapaasti valita omaan ohjelmaansa sopivan tavan tallentaa tietoa.&lt;br /&gt;
&lt;br /&gt;
Nykyisin monet Linux-jakelut käyttävät UTF-8:aa oletuksena. Tämän voi havaita siitä, että järjestelmän käyttämien [[lokaali]]en nimessä on ”.UTF-8”. Esimerkiksi Suomessa käytetään lokaalia nimeltä ”fi_FI.UTF-8”. Tällaista lokaalia käytettäessä järjestelmä tukee Unicodea ja mm. tiedostojen nimiin ja tekstitiedostoihin on periaatteessa mahdollista kirjoittaa kaikkia Unicode-merkkejä. Käytännössä mikään fontti ei yksinään kykene näyttämään kaikkia merkkejä.&lt;br /&gt;
&lt;br /&gt;
== [[Tiedostojärjestelmä]]t ==&lt;br /&gt;
&lt;br /&gt;
=== Ext3 ja muut Unixien tiedostojärjestelmät ===&lt;br /&gt;
&lt;br /&gt;
[[Ext3]] on Linuxissa yleisesti käytetty tiedostojärjestelmä. Se tukee täydellisesti Unicodea ja UTF-8:aa mutta tekee sen tavallaan tietämättään. Samoin on asia muissakin tiedostojärjestelmissä, joita käytetään Linuxissa ja Unix-tyyppisissä käyttöjärjestelmissä. Tiedostojärjestelmät eivät välitä, mitä merkkejä tiedostojen nimissä on, eivätkä ne tallenna mitään tietoa käytetystä merkistöstä tai sen koodaustavasta. Poikkeuksena on nollatavu (ASCII NUL, U+0000) ja [[vinoviiva]] (”/”, U+002F), jotka ovat kiellettyjä merkkejä tiedostonnimissä.&lt;br /&gt;
&lt;br /&gt;
Tiedostojärjestelmää lukiessaan Linux tulkitsee tiedostojen nimet käytössä olevan lokaalin perusteella. Jos käytössä on UTF-8-lokaali (esimerkiksi fi_FI.UTF-8), niin järjestelmä tulkitsee, että tiedostojen nimet ovat UTF-8-koodattuja. Tästä seuraa sellainen ikävä asia, että jos tiedostojen nimet on kirjoitettu käyttäen eri lokaalia kuin mikä parhaillaan on käytössä, niin todennäköisesti nimet eivät näy oikein. Tiedostojen nimien muuttaminen merkistökoodauksesta toiseen onnistuu [[convmv]]-ohjelmalla.&lt;br /&gt;
&lt;br /&gt;
=== NTFS ===&lt;br /&gt;
&lt;br /&gt;
[[NTFS]] on Microsoftin kehittämä tiedostojärjestelmä, ja sitä käytetään Windows-koneissa. Monet Linux-käytäjät pitävät koneellaan myös Windowsia ja liittävät Windowsin kiintolevyosiot osaksi Linux-järjestelmää, joten tässä yhteydessä on syytä kertoa, kuinka se tehdään mahdollisimman yhteensopivasti.&lt;br /&gt;
&lt;br /&gt;
NTFS tukee Unicodea, ja se tallentaa tiedostojen nimet aina UTF-16-muodossa. Jotta kaikki tiedostojen nimet näkyisivät oikein Linuxissa, täytyy Linuxissa olla käytössä UTF-8-lokaali. NTFS-tiedostojärjestelmää liitettäessä täytyy [[mount]]-komennolle vielä kertoa, mikä merkistö Linuxissa on käytössä, koska vasta tämän tiedon avulla NTFS:llä olevat tiedostojen nimet osataan muuttaa UTF-16:sta Linuxin ymmärtämään muotoon. UTF-8-lokaalia käytettäessä annetaan [[mount]]-komennolle optioksi ”nls=utf8”. Sen voi tehdä esimerkiksi [[fstab|/etc/fstab]]-tiedostossa seuraavan esimerkin tapaan:&lt;br /&gt;
 /dev/hdb1   /media/windows-c   ntfs   nls=utf8,uid=1000   0   0&lt;br /&gt;
Katso lisätietoja artikkelista [[fstab]] sekä Linuxista komennoilla &amp;lt;tt&amp;gt;man mount&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;man fstab&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Jos käytössä on uudempi [[ntfs-3g]]-ajuri, käytetään optiota ”locale=fi_FI.UTF-8”:&lt;br /&gt;
&lt;br /&gt;
 /dev/hdb1   /media/windows-c   ntfs-3g   locale=fi_FI.UTF-8   0   0&lt;br /&gt;
&lt;br /&gt;
=== FAT ===&lt;br /&gt;
&lt;br /&gt;
Myös [[FAT]] on Microsoftin kehittämä tiedostojärjestelmä. Sitä käytetään paitsi Windowsissa mutta hyvin yleisesti myös USB-muistien, digikameroiden ja kannettavien MP3-soittimien tiedostojärjestelmänä. Pitkissä tiedostojen nimissä myös FAT tukee Unicodea, ja se periaatteessa tallentaa nimet UTF-16-muodossa. Ikänsä vuoksi FAT tukee kuitenkin vain Unicoden ensimmäisiä versioita ja merkkejä vain nk. Basic Multilingual Planesta (U+0000..U+FFFF). FATin tukema merkkivalikoima käsittää kuitenkin suurimman osan maailman kirjoitusmerkeistä, joten sen Unicode-tuki on useimpien kielten näkökulmasta varsin hyvä.&lt;br /&gt;
&lt;br /&gt;
Samoin kuin NTFS:ssä, myös FAT-tiedostojärjestelmää liitettäessä täytyy Linuxille kertoa, mihin muotoon tiedostojen nimet täytyy muuttaa. Käytettäessä Linuxissa UTF-8-lokaalia, täytyy FAT-tiedostojärjestelmä liittää Linuxiin antamalla [[mount]]-komennolle optioksi ”utf8”. Siten [[fstab|/etc/fstab]]-tiedostoon laitettaisiin esimerkiksi rivi:&lt;br /&gt;
 /dev/hdb5   /media/windows-d   vfat   utf8,dmask=777,fmask=666   0   0&lt;br /&gt;
&lt;br /&gt;
== Tekstitiedostot ja tekstieditorit ==&lt;br /&gt;
&lt;br /&gt;
Jos omassa Linux-järjestelmässä on aiemmin ollut käytössä ISO-8859-15-merkistö (esimerkiksi lokaali fi_FI@euro) ja sittemmin on siirrytty UTF-8:aan, täytyy omat tekstitiedostot muuttaa UTF-8-koodatuiksi, jotta niiden sisältö näkyisi oikein. Yksi tapa tekstitiedoston muuttamiseen UTF-8-koodaukseen on avata se johonkin tekstieditoriin ja tallentaa sitten teksti uudella koodauksella. Nopeampaa saattaa kuitenkin olla komentotulkin ja [[recode]]-ohjelman käyttö:&lt;br /&gt;
 recode ISO-8859-15..UTF-8 tiedosto.txt&lt;br /&gt;
Tiedostojen nimissä käytetyn merkistön muuntaminen onnistuu [[convmv]]-nimisellä ohjelmalla.&lt;br /&gt;
&lt;br /&gt;
=== Emacs ===&lt;br /&gt;
&lt;br /&gt;
GNU [[Emacs]] toimii versiosta 22 alkaen automaattisesti UTF-8:n kanssa. Emacs 21:ssä on &amp;lt;tt&amp;gt;.emacs&amp;lt;/tt&amp;gt;-asetustiedostoon lisättävä seuraavat rivit (tuki 21:ssä ei ole ongelmaton, katso esim. Debianin bugitietokanta):&lt;br /&gt;
&lt;br /&gt;
 (when (= emacs-major-version 21)&lt;br /&gt;
   (prefer-coding-system &#039;utf-8)&lt;br /&gt;
   (set-keyboard-coding-system &#039;utf-8)&lt;br /&gt;
   (set-terminal-coding-system &#039;utf-8))&lt;br /&gt;
&lt;br /&gt;
=== Vim ===&lt;br /&gt;
&lt;br /&gt;
[[Vim]] tukee UTF-8:aa automaattisesti, jos käytössä on UTF-8-lokaali. Nykyiset Vimin versiot tukevat kutakuinkin täydellisesti kaikkia muitakin merkistöjä ja eri koodaustapoja. Tallennettavan tiedoston merkistöön voi vaikuttaa muuttujan &#039;fileencoding&#039; avulla.&lt;br /&gt;
&lt;br /&gt;
== Muut ohjelmat ==&lt;br /&gt;
&lt;br /&gt;
Eräät, varsinkin vanhemmat, ohjelmat eivät hallitse UTF-8-merkistökoodauksen käyttöä. Tällaisia ovat mm. uutistenlukija [[slrn]] ja vanhemmat versiot [[Nano]]sta. Slrn tosin osaa näyttää UTF-8:lla koodatut kirjoitukset oikein siinä määrin kun niissä olevat merkit sopivat johonkin kahdeksanbittiseen merkistöön, mutta ei toimi mikäli pääteikkunassakin on UTF-8 käytössä.&lt;br /&gt;
&lt;br /&gt;
Tällaista ohjelmaa voi käyttää [[luit]]-ohjelman avulla esimerkiksi näin.&lt;br /&gt;
 LC_ALL=en_US.ISO-8859-1 luit ohjelmannimi&lt;br /&gt;
Samaa komentoa voi käyttää myös ottaessasi ssh-yhteyden sellaiseen koneeseen, jossa käytetään jotakin 8-bittistä merkistöä.&lt;br /&gt;
&lt;br /&gt;
Myöskään kaikki graafiset ohjelmat eivät hallitse UTF-8:aa, esimerkiksi [[Dillo]]-selain ei toistaiseksi osaa näyttää sillä koodattuja www-sivuja.&lt;br /&gt;
&lt;br /&gt;
== IRC ==&lt;br /&gt;
&lt;br /&gt;
Nykyisin suomalaisilla IRC-kanavilla käytetään enimmäkseen vanhoja 8-bittisiä merkistöjä, joilla esiintyy edellä kuvattuja ongelmia. Tästä syystä siirros UTF-8:n käyttöön on pikkuhiljaa tapahtumassa, mutta siirrosta luonnollisesti hidastaa se, että monet asiakasohjelmat eivät tue UTF-8-merkistöä lainkaan ilman erillisiä skriptejä ja toisaalta myös se, että vain muutama asiakasohjelma saadaan tukemaan vanhaa 8-bittistä ja UTF-8:a samaan aikaan jolloin muiden kirjoittamat tekstit näkyisivät oikein riippumatta siitä, kumpaa merkistöä käytetään. Tilanne onneksi kuitenkin paranee kaiken aikaa ja on selvää että UTF-8:n käyttöön tullaan tulevaisuudessa siirtymään kokonaan. Siirros ei kuitenkaan missään tapauksessa tule tapahtumaan yhden yön aikana, joten olisi toivottavaa että mahdollisimman monista asiakasohjelmista löytyisi sekakäytön mahdollistava merkistön automaattinen tunnistus.&lt;br /&gt;
Alla on lueteltu tärkeimpien IRC-ohjelmien UTF-8-yhteensopivuus.&lt;br /&gt;
&lt;br /&gt;
=== ChatZilla ===&lt;br /&gt;
&lt;br /&gt;
Merkistö on valittavissa valikosta, ei automaattista tunnistusta.&lt;br /&gt;
&lt;br /&gt;
=== Irssi ===&lt;br /&gt;
&lt;br /&gt;
[[Irssi]] 0.8.10 tukee merkistömuutoksia nykyisessä vakaassa versiossaan ja sitä edeltäneissä julkaisuehdokkaissa rc5:stä eteenpäin. Tämä mahdollistaa merkistön valinnan kanavakohtaisesti, kuten myös sen, että tästä riippumatta voidaan esimerkiksi lokit kirjoittaa aina UTF-8-muodossa.  Tärkeimmät asetukset ovat &amp;lt;tt&amp;gt;/set term_charset &amp;lt;nowiki&amp;gt;&amp;lt;merkistö&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; (asettaa terminaalin käyttämän merkistön, yleensä UTF-8), &amp;lt;tt&amp;gt;/set recode_out_default_charset&amp;lt;/tt&amp;gt; (asettaa oletusmerkistön lähtevälle tekstille, yleensä UTF-8 tai ISO-8859-15) ja &amp;lt;tt&amp;gt;/recode add &amp;lt;nowiki&amp;gt;&amp;lt;merkistö&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; (asettaa aktiivisessa ikkunassa käytettävän merkistön). Merkistön automaattinen tunnistus toimii käytännössä luotettavasti.&lt;br /&gt;
&lt;br /&gt;
Irssi 0.8.10rc4 ja vanhemmat eivät sisällä sisäänrakennettua merkistömuunnostukea. &amp;lt;tt&amp;gt;/set term_type utf8&amp;lt;/tt&amp;gt; tai &amp;lt;tt&amp;gt;/set term_type 8bit&amp;lt;/tt&amp;gt; on asetettava terminaalin tyypin mukaisesti. Merkistömuunnostuen saa skripteillä recode.pl ja recode_ion.pl tai liitännäisellä charconv. Älä asenna useampaa samanaikaisesti, yksi riittää. rc5 ja rc6-versioissa recode-toiminto oli kehitysasteella, joten toimivuus ja ominaisuudet eivät ole täydellisiä. Mikäli mahdollista, nämä versiot kannattaa tietenkin päivittää uusimpaan vakaaseen versioon.&lt;br /&gt;
&lt;br /&gt;
Erään ongelman muodostavat kanavat, joiden nimissä käytetään esimerkiksi Latin1-merkkejä, suomenkielisillä kanavilla yleensä ääkkösiä. UTF-8-terminaalilla niitä ei suoraan voi kirjoittaa ja UTF-8:lla kirjoitettu kanava #ääkkönen tietenkin on irc-palvelimen kannalta täysin eri kanava kuin vastaava nimi Latin1:llä kirjoitettuna. Ongelman voi kiertää esimerkiksi käyttämällä komennon &amp;lt;tt&amp;gt;/join #ääkkönen&amp;lt;/tt&amp;gt; sijaan &amp;lt;tt&amp;gt;/eval&amp;lt;/tt&amp;gt;-komentoa, jolloin merkkien numerokoodeja voidaan kirjoittaa suoraan esimerkiksi oktaaleina: &amp;lt;tt&amp;gt;/eval /join \344\344kk\366nen&amp;lt;/tt&amp;gt;. Merkkien koodeja voi tarkistaa esimerkiksi [http://www.cs.tut.fi/~jkorpela/latin1.html tästä taulukosta].&lt;br /&gt;
&lt;br /&gt;
=== KVIrc ===&lt;br /&gt;
&lt;br /&gt;
IRC-client [[QT]]/[[KDE|KDE:lle]]. Tukee suoraan merkistön automaattista tunnistusta. Yläkulmassa on kiinalainen kirjoitusmerkki, josta voi valita merkistön kanavakohtaisesti (myös verkkokohtainen ja ohjelmanlaajuinen merkistön valinta on mahdollista). UTF-8:n recode vanhaan muotoon onnistuu valinnalla Smart-alavalikon valinnalla &amp;lt;tt&amp;gt;UTF-8/ISO-8859-15 ( UTF-8? -&amp;gt; Western, Latin 1 + Euro)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
KVirc on saatavilla myös Windowssille, joten sitä voi tarjota merkistöongelmista kärsiville mIRC:n käyttäjille.&lt;br /&gt;
&lt;br /&gt;
=== mIRC ===&lt;br /&gt;
&lt;br /&gt;
mIRC ei ole Linux-ohjelma, mutta monet käyttävät Windowsissa vanhoja versioita siitä ja valittavat UTF:stä juuri siksi että skandit eivät näy heillä. Kuitenkin mIRCin uusin versio osaa näyttää oikein myös UTF-8-koodatut skandit oletusasetuksilla.&lt;br /&gt;
&lt;br /&gt;
=== Wireless IRC ===&lt;br /&gt;
&lt;br /&gt;
Ei tue merkistön automaattista tunnistusta, mutta asetuksista voi määritellä merkistöksi UTF-8:n.&lt;br /&gt;
&lt;br /&gt;
=== X-Chat ===&lt;br /&gt;
&lt;br /&gt;
Verkkokohtainen merkistön voi valita asetuksista. Merkistön automaattinen tunnistus on käytössä vain kun UTF-8-merkistö on valittu.&lt;br /&gt;
&lt;br /&gt;
X-Chatin sivustolta löytyy myös python-scripti (lamechan.py), jolla voi kanavakohtaisesti valita käytetäänkö UTF-8:aa vai jotain toista merkistöä. Tätä scriptiä ei ole saatu toimimaan X-Chatin Windows-versioilla.&lt;br /&gt;
&lt;br /&gt;
=== jmIrc ===&lt;br /&gt;
&lt;br /&gt;
Asetuksista voi määritellä merkistöksi UTF-8:n, tukee myös merkistön automaattista tunnistusta.&lt;br /&gt;
&lt;br /&gt;
== Tietoturva ==&lt;br /&gt;
&lt;br /&gt;
Unicode tuo mukanaan joukon tietoturvaongelmia, ennen kautta siksi, että se on niin monimutkainen, eikä monikaan ohjelmoija ymmärrä kaikkia niitä mekanismeja, joita tarvitaan hänelle tuntemattomissa kielissä. Perustavanlaatuinen ongelma on, että merkkijonon pituus merkkeinä ei sano paljoakaan sen pituudesta ruudulla (tasaleveälläkään kirjamisella) tai tavuina &amp;amp;ndash; eikä päinvastoinkaan. Väärien oletusten varassa toimivat ohjelmat ja [[kirjasto|ohjelmakirjastot]] saattavat olla alttiita puskuriyliovuodoille yms. Tässä muutamia muita ongelmia:&lt;br /&gt;
&lt;br /&gt;
Samaa merkkiä voidaan esittää eri tavoilla, esimerkiksi &amp;quot;ä&amp;quot; sellaisenaan tai &amp;quot;a&amp;quot;:n ja pisteiden yhdistelmänä (tämä on ongelmallista myös merkkijonoja etsittäessä [[grep]]illä tms.). Jos merkkien esitystapaa muutetaan sen jälkeen, kun niiden vaarattomuus on tarkistettu, tarkistuksen voi ohittaa. Yksinkertaistettu algoritmi saattaa myös hyväksyä kiellettyjä koodaustapoja, joilla esimerkiksi ASCII-merkkejä voidaan koodata useammassa tavussa tarkistusten ohittamiseksi.&lt;br /&gt;
&lt;br /&gt;
Näytöllä vaarattomalta näyttävä merkkijono on saatettu muodostaa käyttäen lähes samalta näyttäviä merkkejä, joilla kuitenkin on eri merkitys (vrt nokia.com vs. nokía.com). Vastaavaa voi saada aikaan kirjoitussuunnalla kikkailemalla.&lt;br /&gt;
&lt;br /&gt;
==Eräitä Unicode-merkkejä==&lt;br /&gt;
* Lainausmerkit (yksin ja kaksin): ’ ’’ ” ””  &lt;br /&gt;
* Kolme pistettä: … (U+2026 HORIZONTAL ELLIPSIS)&lt;br /&gt;
* Luetelmapallo: • (U+2022 BULLET)&lt;br /&gt;
&lt;br /&gt;
===Viivamerkit===&lt;br /&gt;
*n‐viiva: – (U+2013 EN DASH)&lt;br /&gt;
Käyttö: Varsinaisena ajatusviivana. Ellipsiviiva (poisjätön merkki): 50,– euroa, –kele! Alkamisen ja loppumisen ääripäät: sivut 10–12, Helsingin–Hämeenlinnan rautatie. Lainatun tekstin erottamiseen. Luetteloviiva. Repliikkiviiva. Osapuolten erottamiseen: Paasikiven–Kekkosen linja.&lt;br /&gt;
*Yhdysmerkki: ‐ (U+2010 HYPHEN)&lt;br /&gt;
Käyttö: yhdysnimissä ja kun sanan toinen puolisko on erisnimi tai lyhenne: Maija‐Liisa Virtanen‐Mäkinen, SM‐kilpailu, Tampere‐talo. Tavuviivana. ”luuta‐akka”, ”pakastekaapit ja ‐arkut”, ”sydän‐ ja verisuonitaudit”&lt;br /&gt;
&lt;br /&gt;
===Matematiikkaa===&lt;br /&gt;
&lt;br /&gt;
* Peruslaskutoimitukset: + − × : ∕ (U+2215 DIVISION SLASH)&lt;br /&gt;
* Murtolukuja: ⅓ ⅔ ¼ ½ ¾ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅛ ⅜ ⅝ ⅞&lt;br /&gt;
* ⁄ (U+2044 FRACTION SLASH)&lt;br /&gt;
* Yhtäläisyys ja epäyhtäläisyys: ≈ = ≠ &amp;lt; ≤ &amp;gt; ≥&lt;br /&gt;
* Yläindeksinumerot ja ‐merkit: ⁰ ¹ ² ³ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁽ ⁾ ⁿ ⁱ&lt;br /&gt;
* Alaindeksinumerot ja ‐merkit: ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎&lt;br /&gt;
* Muut&lt;br /&gt;
** ∶ (U+2236 RATIO)&lt;br /&gt;
** ⇒ ∞ ‰ ± °&lt;br /&gt;
&lt;br /&gt;
===Kieliä===&lt;br /&gt;
*Englanti:&lt;br /&gt;
**— (U+2014 EM DASH)&lt;br /&gt;
**“ (U+201C LEFT DOUBLE QUOTATION MARK) &lt;br /&gt;
**‘ (U+2018 LEFT SINGLE QUOTATION MARK)&lt;br /&gt;
*Espanja: Ñ ñ ¿ ¡&lt;br /&gt;
*Norja ja tanska: Æ æ Ø ø&lt;br /&gt;
*Ranska: È É Ê Ë è é ê ë Ò Ó Ô ò ó ô Ç ç Ï ï&lt;br /&gt;
*Saksa: ß Ü ü&lt;br /&gt;
*Viro: Õ õ&lt;br /&gt;
&lt;br /&gt;
===Sekalaisia===&lt;br /&gt;
* © ® ℗ ™ ℠ § ¶ µ € → ♀ ♂ &lt;br /&gt;
*Teinixmäisyyksiä: ☺ ☹ ♥ ‽ ☠ ☢ ☣ ☮ ♫ &lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
* [[wikipedia:fi:Unicode|Unicode suomenkielisessä Wikipediassa]]&lt;br /&gt;
* [http://iki.fi/~juhtolv/unicode/suomi.html Suomen kielen kirjoittaminen Unicodea käyttäen]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Verkko]]&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Unicode&amp;diff=30736</id>
		<title>Unicode</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Unicode&amp;diff=30736"/>
		<updated>2010-02-16T12:09:04Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: fmt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{perustietoa}}&lt;br /&gt;
[[wikipedia:fi:Unicode|Unicode Wikipediassa]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Unicode&#039;&#039;&#039; on standardi, joka muun muassa määrittelee useimmille maailman kirjoitusmerkeille omat merkkikoodinsa. Standardin tarkoituksena on korvata tähän saakka käytössä olleet hyvin erilaiset ja keskenään huonosti yhteensopivat merkistöt. Suomessa on Linux-koneissa käytetty enimmäkseen ISO-8859-15-merkistöä. Vanhojen merkistöjen ongelma on, että niiden merkkivalikoima on hyvin rajallinen, esimerkiksi 256 merkkiä. Se yleensä tarkoittaa, että samalla merkistöllä ei voida esittää useita kovin erilaisia kieliä. Esimerkiksi sama tekstitiedosto tai sähköpostiviesti ei voi sisältää tekstiä kuin niillä kielillä, joita kyseisellä merkistöllä voidaan esittää. Tämä ei kenties häiritse yksittäistä tietokoneenkäyttäjää, mutta sitä mukaa, kun kansainvälinen tietoliikenne on lisääntynyt, on myös lisääntynyt tarve luoda kaikille yhteinen standardi kirjoitusmerkkien esittämiseksi.&lt;br /&gt;
&lt;br /&gt;
Unicode pyrkii ratkaisemaan vanhojen merkistöjen rajallisuuteen liittyvät ongelmat luomalla merkistön, joka sisältää kaikki nykyiset (ja jopa entiset) kirjoitusjärjestelmät. Unicode-standardi käsittää 1 114 112 merkkipaikkaa, ja ne yksilöidään U+xxxx-muotoisella tunnuksella, jossa ”xxxx” on merkin numerokoodi heksadesimaalimuodossa (16-järjestelmä). Mahdolliset koodit ovat U+0000..U+10FFFF. Käytännössä ihan jokainen merkkipaikka ei viittaa mihinkään kirjoitusmerkkiin, vaan mukana on jonkin verran myös erilaisia ohjauskoodeja tietokonetta varten sekä Unicode-standardiin liittyvää erikoistietoa. Joka tapauksessa merkkipaikkoja on niin paljon, että kaikki olemassa olevat ja jo historiaan jääneet kirjoitusmerkit mahtuvan mukaan. Tästä huolimatta merkkipaikkoja on runsaasti tyhjillään tulevaisuuden varalta ja kaikkia tuskin tarvitaan koskaan. Mukana on myös suuri joukko tarkoituksella määrittelemättömiä, yksityiseen käyttöön varattuja merkkipaikkoja.&lt;br /&gt;
&lt;br /&gt;
Unicode-merkkejä sisältävää tekstiä voidaan tallentaa tietokoneelle useilla eri tavoilla. Linuxissa ja yleensäkin tietoliikenteessä käytetty Unicoden koodaustapa on nimeltään &#039;&#039;&#039;[[UTF-8]]&#039;&#039;&#039;. Tässä koodauksessa yksi Unicode-merkki vie tallennustilaa 1–4 oktettia eli 8 bitin tavua. ASCII-merkistöön kuuluvat merkit (U+0000..U+007F) esitetään UTF-8:ssa sellaisenaan, yhtenä tavuna, joten ASCII on täysin UTF-8-yhteensopiva. Se onkin Linuxissa tärkeää, koska siinä käytetään paljon ASCII-muodossa olevia asetustiedostoja ja käynnistysskriptejä. Muiden kuin ASCII-merkkien esittämiseksi tarvitaan avuksi lisätavuja, ja esimerkiksi suomen kieleen kuuluvien ä- ja ö-kirjainten esittämiseen tarvitaan kaksi tavua.&lt;br /&gt;
&lt;br /&gt;
UTF-8:n lisäksi on olemassa muitakin koodaustapoja, esimerkiksi UTF-16 ja UTF-32. UTF-16:ssa merkit esitetään joko yhtenä 16-bittisenä lukuna, tai mikäli merkin koodi on sitä suurempi, niin kahden 16-bittisen luvun muodostamana nk. sijaismerkkiparina (surrogate pair). UTF-32:ssa merkki esitetään aina yhtenä 32-bittisenä lukuna. Kuten todettu, Linuxissa käytetään pääasiassa UTF-8:aa. Ohjelmat voivat kuitenkin sisäisesti käyttää muitakin koodaustapoja, ja ohjelmien tekijät voivat vapaasti valita omaan ohjelmaansa sopivan tavan tallentaa tietoa.&lt;br /&gt;
&lt;br /&gt;
Nykyisin monet Linux-jakelut käyttävät UTF-8:aa oletuksena. Tämän voi havaita siitä, että järjestelmän käyttämien lokaalien nimessä on ”.UTF-8”. Esimerkiksi Suomessa käytetään lokaalia nimeltä ”fi_FI.UTF-8”. Tällaista lokaalia käytettäessä järjestelmä tukee Unicodea ja mm. tiedostojen nimiin ja tekstitiedostoihin on periaatteessa mahdollista kirjoittaa kaikkia Unicode-merkkejä. Käytännössä mikään fontti ei yksinään kykene näyttämään kaikkia merkkejä.&lt;br /&gt;
&lt;br /&gt;
== [[Tiedostojärjestelmä]]t ==&lt;br /&gt;
&lt;br /&gt;
=== Ext3 ja muut Unixien tiedostojärjestelmät ===&lt;br /&gt;
&lt;br /&gt;
[[Ext3]] on Linuxissa yleisesti käytetty tiedostojärjestelmä. Se tukee täydellisesti Unicodea ja UTF-8:aa mutta tekee sen tavallaan tietämättään. Samoin on asia muissakin tiedostojärjestelmissä, joita käytetään Linuxissa ja Unix-tyyppisissä käyttöjärjestelmissä. Tiedostojärjestelmät eivät välitä, mitä merkkejä tiedostojen nimissä on, eivätkä ne tallenna mitään tietoa käytetystä merkistöstä tai sen koodaustavasta. Poikkeuksena on nollatavu (ASCII NUL, U+0000) ja [[vinoviiva]] (”/”, U+002F), jotka ovat kiellettyjä merkkejä tiedostonnimissä.&lt;br /&gt;
&lt;br /&gt;
Tiedostojärjestelmää lukiessaan Linux tulkitsee tiedostojen nimet käytössä olevan lokaalin perusteella. Jos käytössä on UTF-8-lokaali (esimerkiksi fi_FI.UTF-8), niin järjestelmä tulkitsee, että tiedostojen nimet ovat UTF-8-koodattuja. Tästä seuraa sellainen ikävä asia, että jos tiedostojen nimet on kirjoitettu käyttäen eri lokaalia kuin mikä parhaillaan on käytössä, niin todennäköisesti nimet eivät näy oikein. Tiedostojen nimien muuttaminen merkistökoodauksesta toiseen onnistuu [[convmv]]-ohjelmalla.&lt;br /&gt;
&lt;br /&gt;
=== NTFS ===&lt;br /&gt;
&lt;br /&gt;
[[NTFS]] on Microsoftin kehittämä tiedostojärjestelmä, ja sitä käytetään Windows-koneissa. Monet Linux-käytäjät pitävät koneellaan myös Windowsia ja liittävät Windowsin kiintolevyosiot osaksi Linux-järjestelmää, joten tässä yhteydessä on syytä kertoa, kuinka se tehdään mahdollisimman yhteensopivasti.&lt;br /&gt;
&lt;br /&gt;
NTFS tukee Unicodea, ja se tallentaa tiedostojen nimet aina UTF-16-muodossa. Jotta kaikki tiedostojen nimet näkyisivät oikein Linuxissa, täytyy Linuxissa olla käytössä UTF-8-lokaali. NTFS-tiedostojärjestelmää liitettäessä täytyy [[mount]]-komennolle vielä kertoa, mikä merkistö Linuxissa on käytössä, koska vasta tämän tiedon avulla NTFS:llä olevat tiedostojen nimet osataan muuttaa UTF-16:sta Linuxin ymmärtämään muotoon. UTF-8-lokaalia käytettäessä annetaan [[mount]]-komennolle optioksi ”nls=utf8”. Sen voi tehdä esimerkiksi [[fstab|/etc/fstab]]-tiedostossa seuraavan esimerkin tapaan:&lt;br /&gt;
 /dev/hdb1   /media/windows-c   ntfs   nls=utf8,uid=1000   0   0&lt;br /&gt;
Katso lisätietoja artikkelista [[fstab]] sekä Linuxista komennoilla &amp;lt;tt&amp;gt;man mount&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;man fstab&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Jos käytössä on uudempi [[ntfs-3g]]-ajuri, käytetään optiota ”locale=fi_FI.UTF-8”:&lt;br /&gt;
&lt;br /&gt;
 /dev/hdb1   /media/windows-c   ntfs-3g   locale=fi_FI.UTF-8   0   0&lt;br /&gt;
&lt;br /&gt;
=== FAT ===&lt;br /&gt;
&lt;br /&gt;
Myös [[FAT]] on Microsoftin kehittämä tiedostojärjestelmä. Sitä käytetään paitsi Windowsissa mutta hyvin yleisesti myös USB-muistien, digikameroiden ja kannettavien MP3-soittimien tiedostojärjestelmänä. Pitkissä tiedostojen nimissä myös FAT tukee Unicodea, ja se periaatteessa tallentaa nimet UTF-16-muodossa. Ikänsä vuoksi FAT tukee kuitenkin vain Unicoden ensimmäisiä versioita ja merkkejä vain nk. Basic Multilingual Planesta (U+0000..U+FFFF). FATin tukema merkkivalikoima käsittää kuitenkin suurimman osan maailman kirjoitusmerkeistä, joten sen Unicode-tuki on useimpien kielten näkökulmasta varsin hyvä.&lt;br /&gt;
&lt;br /&gt;
Samoin kuin NTFS:ssä, myös FAT-tiedostojärjestelmää liitettäessä täytyy Linuxille kertoa, mihin muotoon tiedostojen nimet täytyy muuttaa. Käytettäessä Linuxissa UTF-8-lokaalia, täytyy FAT-tiedostojärjestelmä liittää Linuxiin antamalla [[mount]]-komennolle optioksi ”utf8”. Siten [[fstab|/etc/fstab]]-tiedostoon laitettaisiin esimerkiksi rivi:&lt;br /&gt;
 /dev/hdb5   /media/windows-d   vfat   utf8,dmask=777,fmask=666   0   0&lt;br /&gt;
&lt;br /&gt;
== Tekstitiedostot ja tekstieditorit ==&lt;br /&gt;
&lt;br /&gt;
Jos omassa Linux-järjestelmässä on aiemmin ollut käytössä ISO-8859-15-merkistö (esimerkiksi lokaali fi_FI@euro) ja sittemmin on siirrytty UTF-8:aan, täytyy omat tekstitiedostot muuttaa UTF-8-koodatuiksi, jotta niiden sisältö näkyisi oikein. Yksi tapa tekstitiedoston muuttamiseen UTF-8-koodaukseen on avata se johonkin tekstieditoriin ja tallentaa sitten teksti uudella koodauksella. Nopeampaa saattaa kuitenkin olla komentotulkin ja [[recode]]-ohjelman käyttö:&lt;br /&gt;
 recode ISO-8859-15..UTF-8 tiedosto.txt&lt;br /&gt;
Tiedostojen nimissä käytetyn merkistön muuntaminen onnistuu [[convmv]]-nimisellä ohjelmalla.&lt;br /&gt;
&lt;br /&gt;
=== Emacs ===&lt;br /&gt;
&lt;br /&gt;
GNU [[Emacs]] toimii versiosta 22 alkaen automaattisesti UTF-8:n kanssa. Emacs 21:ssä on &amp;lt;tt&amp;gt;.emacs&amp;lt;/tt&amp;gt;-asetustiedostoon lisättävä seuraavat rivit (tuki 21:ssä ei ole ongelmaton, katso esim. Debianin bugitietokanta):&lt;br /&gt;
&lt;br /&gt;
 (when (= emacs-major-version 21)&lt;br /&gt;
   (prefer-coding-system &#039;utf-8)&lt;br /&gt;
   (set-keyboard-coding-system &#039;utf-8)&lt;br /&gt;
   (set-terminal-coding-system &#039;utf-8))&lt;br /&gt;
&lt;br /&gt;
=== Vim ===&lt;br /&gt;
&lt;br /&gt;
[[Vim]] tukee UTF-8:aa automaattisesti, jos käytössä on UTF-8-lokaali. Nykyiset Vimin versiot tukevat kutakuinkin täydellisesti kaikkia muitakin merkistöjä ja eri koodaustapoja. Tallennettavan tiedoston merkistöön voi vaikuttaa muuttujan &#039;fileencoding&#039; avulla.&lt;br /&gt;
&lt;br /&gt;
== Muut ohjelmat ==&lt;br /&gt;
&lt;br /&gt;
Eräät, varsinkin vanhemmat, ohjelmat eivät hallitse UTF-8-merkistökoodauksen käyttöä. Tällaisia ovat mm. uutistenlukija [[slrn]] ja vanhemmat versiot [[Nano]]sta. Slrn tosin osaa näyttää UTF-8:lla koodatut kirjoitukset oikein siinä määrin kun niissä olevat merkit sopivat johonkin kahdeksanbittiseen merkistöön, mutta ei toimi mikäli pääteikkunassakin on UTF-8 käytössä.&lt;br /&gt;
&lt;br /&gt;
Tällaista ohjelmaa voi käyttää [[luit]]-ohjelman avulla esimerkiksi näin.&lt;br /&gt;
 LC_ALL=en_US.ISO-8859-1 luit ohjelmannimi&lt;br /&gt;
Samaa komentoa voi käyttää myös ottaessasi ssh-yhteyden sellaiseen koneeseen, jossa käytetään jotakin 8-bittistä merkistöä.&lt;br /&gt;
&lt;br /&gt;
Myöskään kaikki graafiset ohjelmat eivät hallitse UTF-8:aa, esimerkiksi [[Dillo]]-selain ei toistaiseksi osaa näyttää sillä koodattuja www-sivuja.&lt;br /&gt;
&lt;br /&gt;
== IRC ==&lt;br /&gt;
&lt;br /&gt;
Nykyisin suomalaisilla IRC-kanavilla käytetään enimmäkseen vanhoja 8-bittisiä merkistöjä, joilla esiintyy edellä kuvattuja ongelmia. Tästä syystä siirros UTF-8:n käyttöön on pikkuhiljaa tapahtumassa, mutta siirrosta luonnollisesti hidastaa se, että monet asiakasohjelmat eivät tue UTF-8-merkistöä lainkaan ilman erillisiä skriptejä ja toisaalta myös se, että vain muutama asiakasohjelma saadaan tukemaan vanhaa 8-bittistä ja UTF-8:a samaan aikaan jolloin muiden kirjoittamat tekstit näkyisivät oikein riippumatta siitä, kumpaa merkistöä käytetään. Tilanne onneksi kuitenkin paranee kaiken aikaa ja on selvää että UTF-8:n käyttöön tullaan tulevaisuudessa siirtymään kokonaan. Siirros ei kuitenkaan missään tapauksessa tule tapahtumaan yhden yön aikana, joten olisi toivottavaa että mahdollisimman monista asiakasohjelmista löytyisi sekakäytön mahdollistava merkistön automaattinen tunnistus.&lt;br /&gt;
Alla on lueteltu tärkeimpien IRC-ohjelmien UTF-8-yhteensopivuus.&lt;br /&gt;
&lt;br /&gt;
=== ChatZilla ===&lt;br /&gt;
&lt;br /&gt;
Merkistö on valittavissa valikosta, ei automaattista tunnistusta.&lt;br /&gt;
&lt;br /&gt;
=== Irssi ===&lt;br /&gt;
&lt;br /&gt;
[[Irssi]] 0.8.10 tukee merkistömuutoksia nykyisessä vakaassa versiossaan ja sitä edeltäneissä julkaisuehdokkaissa rc5:stä eteenpäin. Tämä mahdollistaa merkistön valinnan kanavakohtaisesti, kuten myös sen, että tästä riippumatta voidaan esimerkiksi lokit kirjoittaa aina UTF-8-muodossa.  Tärkeimmät asetukset ovat &amp;lt;tt&amp;gt;/set term_charset &amp;lt;nowiki&amp;gt;&amp;lt;merkistö&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; (asettaa terminaalin käyttämän merkistön, yleensä UTF-8), &amp;lt;tt&amp;gt;/set recode_out_default_charset&amp;lt;/tt&amp;gt; (asettaa oletusmerkistön lähtevälle tekstille, yleensä UTF-8 tai ISO-8859-15) ja &amp;lt;tt&amp;gt;/recode add &amp;lt;nowiki&amp;gt;&amp;lt;merkistö&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; (asettaa aktiivisessa ikkunassa käytettävän merkistön). Merkistön automaattinen tunnistus toimii käytännössä luotettavasti.&lt;br /&gt;
&lt;br /&gt;
Irssi 0.8.10rc4 ja vanhemmat eivät sisällä sisäänrakennettua merkistömuunnostukea. &amp;lt;tt&amp;gt;/set term_type utf8&amp;lt;/tt&amp;gt; tai &amp;lt;tt&amp;gt;/set term_type 8bit&amp;lt;/tt&amp;gt; on asetettava terminaalin tyypin mukaisesti. Merkistömuunnostuen saa skripteillä recode.pl ja recode_ion.pl tai liitännäisellä charconv. Älä asenna useampaa samanaikaisesti, yksi riittää. rc5 ja rc6-versioissa recode-toiminto oli kehitysasteella, joten toimivuus ja ominaisuudet eivät ole täydellisiä. Mikäli mahdollista, nämä versiot kannattaa tietenkin päivittää uusimpaan vakaaseen versioon.&lt;br /&gt;
&lt;br /&gt;
Erään ongelman muodostavat kanavat, joiden nimissä käytetään esimerkiksi Latin1-merkkejä, suomenkielisillä kanavilla yleensä ääkkösiä. UTF-8-terminaalilla niitä ei suoraan voi kirjoittaa ja UTF-8:lla kirjoitettu kanava #ääkkönen tietenkin on irc-palvelimen kannalta täysin eri kanava kuin vastaava nimi Latin1:llä kirjoitettuna. Ongelman voi kiertää esimerkiksi käyttämällä komennon &amp;lt;tt&amp;gt;/join #ääkkönen&amp;lt;/tt&amp;gt; sijaan &amp;lt;tt&amp;gt;/eval&amp;lt;/tt&amp;gt;-komentoa, jolloin merkkien numerokoodeja voidaan kirjoittaa suoraan esimerkiksi oktaaleina: &amp;lt;tt&amp;gt;/eval /join \344\344kk\366nen&amp;lt;/tt&amp;gt;. Merkkien koodeja voi tarkistaa esimerkiksi [http://www.cs.tut.fi/~jkorpela/latin1.html tästä taulukosta].&lt;br /&gt;
&lt;br /&gt;
=== KVIrc ===&lt;br /&gt;
&lt;br /&gt;
IRC-client [[QT]]/[[KDE|KDE:lle]]. Tukee suoraan merkistön automaattista tunnistusta. Yläkulmassa on kiinalainen kirjoitusmerkki, josta voi valita merkistön kanavakohtaisesti (myös verkkokohtainen ja ohjelmanlaajuinen merkistön valinta on mahdollista). UTF-8:n recode vanhaan muotoon onnistuu valinnalla Smart-alavalikon valinnalla &amp;lt;tt&amp;gt;UTF-8/ISO-8859-15 ( UTF-8? -&amp;gt; Western, Latin 1 + Euro)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
KVirc on saatavilla myös Windowssille, joten sitä voi tarjota merkistöongelmista kärsiville mIRC:n käyttäjille.&lt;br /&gt;
&lt;br /&gt;
=== mIRC ===&lt;br /&gt;
&lt;br /&gt;
mIRC ei ole Linux-ohjelma, mutta monet käyttävät Windowsissa vanhoja versioita siitä ja valittavat UTF:stä juuri siksi että skandit eivät näy heillä. Kuitenkin mIRCin uusin versio osaa näyttää oikein myös UTF-8-koodatut skandit oletusasetuksilla.&lt;br /&gt;
&lt;br /&gt;
=== Wireless IRC ===&lt;br /&gt;
&lt;br /&gt;
Ei tue merkistön automaattista tunnistusta, mutta asetuksista voi määritellä merkistöksi UTF-8:n.&lt;br /&gt;
&lt;br /&gt;
=== X-Chat ===&lt;br /&gt;
&lt;br /&gt;
Verkkokohtainen merkistön voi valita asetuksista. Merkistön automaattinen tunnistus on käytössä vain kun UTF-8-merkistö on valittu.&lt;br /&gt;
&lt;br /&gt;
X-Chatin sivustolta löytyy myös python-scripti (lamechan.py), jolla voi kanavakohtaisesti valita käytetäänkö UTF-8:aa vai jotain toista merkistöä. Tätä scriptiä ei ole saatu toimimaan X-Chatin Windows-versioilla.&lt;br /&gt;
&lt;br /&gt;
=== jmIrc ===&lt;br /&gt;
&lt;br /&gt;
Asetuksista voi määritellä merkistöksi UTF-8:n, tukee myös merkistön automaattista tunnistusta.&lt;br /&gt;
&lt;br /&gt;
== Tietoturva ==&lt;br /&gt;
&lt;br /&gt;
Unicode tuo mukanaan joukon tietoturvaongelmia, ennen kautta siksi, että se on niin monimutkainen, eikä monikaan ohjelmoija ymmärrä kaikkia niitä mekanismeja, joita tarvitaan hänelle tuntemattomissa kielissä. Perustavanlaatuinen ongelma on, että merkkijonon pituus merkkeinä ei sano paljoakaan sen pituudesta ruudulla (tasaleveälläkään kirjamisella) tai tavuina &amp;amp;ndash; eikä päinvastoinkaan. Väärien oletusten varassa toimivat ohjelmat ja [[kirjasto|ohjelmakirjastot]] saattavat olla alttiita puskuriyliovuodoille yms. Tässä muutamia muita ongelmia:&lt;br /&gt;
&lt;br /&gt;
Samaa merkkiä voidaan esittää eri tavoilla, esimerkiksi &amp;quot;ä&amp;quot; sellaisenaan tai &amp;quot;a&amp;quot;:n ja pisteiden yhdistelmänä (tämä on ongelmallista myös merkkijonoja etsittäessä [[grep]]illä tms.). Jos merkkien esitystapaa muutetaan sen jälkeen, kun niiden vaarattomuus on tarkistettu, tarkistuksen voi ohittaa. Yksinkertaistettu algoritmi saattaa myös hyväksyä kiellettyjä koodaustapoja, joilla esimerkiksi ASCII-merkkejä voidaan koodata useammassa tavussa tarkistusten ohittamiseksi.&lt;br /&gt;
&lt;br /&gt;
Näytöllä vaarattomalta näyttävä merkkijono on saatettu muodostaa käyttäen lähes samalta näyttäviä merkkejä, joilla kuitenkin on eri merkitys (vrt nokia.com vs. nokía.com). Vastaavaa voi saada aikaan kirjoitussuunnalla kikkailemalla.&lt;br /&gt;
&lt;br /&gt;
==Eräitä Unicode-merkkejä==&lt;br /&gt;
* Lainausmerkit (yksin ja kaksin): ’ ’’ ” ””  &lt;br /&gt;
* Kolme pistettä: … (U+2026 HORIZONTAL ELLIPSIS)&lt;br /&gt;
* Luetelmapallo: • (U+2022 BULLET)&lt;br /&gt;
&lt;br /&gt;
===Viivamerkit===&lt;br /&gt;
*n‐viiva: – (U+2013 EN DASH)&lt;br /&gt;
Käyttö: Varsinaisena ajatusviivana. Ellipsiviiva (poisjätön merkki): 50,– euroa, –kele! Alkamisen ja loppumisen ääripäät: sivut 10–12, Helsingin–Hämeenlinnan rautatie. Lainatun tekstin erottamiseen. Luetteloviiva. Repliikkiviiva. Osapuolten erottamiseen: Paasikiven–Kekkosen linja.&lt;br /&gt;
*Yhdysmerkki: ‐ (U+2010 HYPHEN)&lt;br /&gt;
Käyttö: yhdysnimissä ja kun sanan toinen puolisko on erisnimi tai lyhenne: Maija‐Liisa Virtanen‐Mäkinen, SM‐kilpailu, Tampere‐talo. Tavuviivana. ”luuta‐akka”, ”pakastekaapit ja ‐arkut”, ”sydän‐ ja verisuonitaudit”&lt;br /&gt;
&lt;br /&gt;
===Matematiikkaa===&lt;br /&gt;
&lt;br /&gt;
* Peruslaskutoimitukset: + − × : ∕ (U+2215 DIVISION SLASH)&lt;br /&gt;
* Murtolukuja: ⅓ ⅔ ¼ ½ ¾ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅛ ⅜ ⅝ ⅞&lt;br /&gt;
* ⁄ (U+2044 FRACTION SLASH)&lt;br /&gt;
* Yhtäläisyys ja epäyhtäläisyys: ≈ = ≠ &amp;lt; ≤ &amp;gt; ≥&lt;br /&gt;
* Yläindeksinumerot ja ‐merkit: ⁰ ¹ ² ³ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁽ ⁾ ⁿ ⁱ&lt;br /&gt;
* Alaindeksinumerot ja ‐merkit: ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎&lt;br /&gt;
* Muut&lt;br /&gt;
** ∶ (U+2236 RATIO)&lt;br /&gt;
** ⇒ ∞ ‰ ± °&lt;br /&gt;
&lt;br /&gt;
===Kieliä===&lt;br /&gt;
*Englanti:&lt;br /&gt;
**— (U+2014 EM DASH)&lt;br /&gt;
**“ (U+201C LEFT DOUBLE QUOTATION MARK) &lt;br /&gt;
**‘ (U+2018 LEFT SINGLE QUOTATION MARK)&lt;br /&gt;
*Espanja: Ñ ñ ¿ ¡&lt;br /&gt;
*Norja ja tanska: Æ æ Ø ø&lt;br /&gt;
*Ranska: È É Ê Ë è é ê ë Ò Ó Ô ò ó ô Ç ç Ï ï&lt;br /&gt;
*Saksa: ß Ü ü&lt;br /&gt;
*Viro: Õ õ&lt;br /&gt;
&lt;br /&gt;
===Sekalaisia===&lt;br /&gt;
* © ® ℗ ™ ℠ § ¶ µ € → ♀ ♂ &lt;br /&gt;
*Teinixmäisyyksiä: ☺ ☹ ♥ ‽ ☠ ☢ ☣ ☮ ♫ &lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
* [[wikipedia:fi:Unicode|Unicode suomenkielisessä Wikipediassa]]&lt;br /&gt;
* [http://iki.fi/~juhtolv/unicode/suomi.html Suomen kielen kirjoittaminen Unicodea käyttäen]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Verkko]]&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;br /&gt;
[[Luokka:Käsitteet]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Lokaali&amp;diff=30735</id>
		<title>Lokaali</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Lokaali&amp;diff=30735"/>
		<updated>2010-02-16T12:02:52Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: Ak: Ohjaus sivulle Locale&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Locale]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Iptables&amp;diff=30734</id>
		<title>Iptables</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Iptables&amp;diff=30734"/>
		<updated>2010-02-16T12:01:24Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: +asetusten listaaminen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Iptables-työkalulla säädetään Linuxin [[Kernel|ytimessä]] olevaa [[Netfilter]]-pakettisuodatinta. Sen avulla voidaan toteuttaa esimerkiksi [[Palomuuri|palomuureja]] ja&lt;br /&gt;
[[wikipedia:fi:reititin|reitittimiä.]]  Iptables on ollut mukana ytimessä versiosta 2.4-alkaen.&lt;br /&gt;
&lt;br /&gt;
== Palomuuriasetusten listaaminen ==&lt;br /&gt;
Tämänhetkiset palomuuriasetukset näkee komennolla&lt;br /&gt;
 iptables -L &lt;br /&gt;
lisä[[valitsin]] -n näyttää osoitteet IP-muodossa. NAT-asetukset näkee komennolla&lt;br /&gt;
 iptables -t nat -L&lt;br /&gt;
&lt;br /&gt;
== Pakettien rajoittaminen ==&lt;br /&gt;
Palomuuri perustuu siihen, että tietyt paketit (tieto liikkuu Internetissä paketteina) pääsevät palomuurin läpi ja tietyt estetään. Näitä esto- ja päästösääntöjä säädetään iptablesilla.&lt;br /&gt;
&lt;br /&gt;
Iptablesin kanssa paketit jaetaan viiteen luokkaan: INPUT, OUTPUT, FORWARD, PREROUTING ja POSTROUTING. OUTPUT-tyyppiset paketit ovat paketteja jotka lähtevät koneeltasi Internettiin - esimerkiksi ladatessasi tämän sivun lähetit wikin palvelimelle paketin, jossa pyysit tätä sivua. Kun palvelin sitten vastaa pyyntöösi lähettäen tätä sivua paketteina, ne tulevat INPUT-tyyppisinä. FORWARD-tyyppiset paketit ovat paketteja, jotka vastaanotetaan toisesta verkosta ja lähetetään toiseen (yleensä Internetistä lähiverkkoon tai päinvastoin). &lt;br /&gt;
&lt;br /&gt;
Vielä yksi perusasia ennen kuin lähdemme säätelemään palomuuriamme: tehtyäsi asetukset ne eivät tallennu mihinkään, vaan seuraavan uudelleenkäynnistyken jälkeen asetukset palautuvat alkuperäisiksi. Tallentaminen onnistuu komennoilla &amp;lt;tt&amp;gt;iptables-save&amp;lt;/tt&amp;gt; ja &amp;lt;tt&amp;gt;iptables-restore&amp;lt;/tt&amp;gt; joista lisää myöhemmin.&lt;br /&gt;
&lt;br /&gt;
Kannattaa myös huomioida että ipforward pitää olla kytketty päälle /etc/sysctl.conf tiedostossa (net.ipv4.ip_forward=1) jotta FORWARD ketjun ja nat taulun säännöillä olisi vaikutusta. Tiedoston muutos tulee voimaan vasta uudelleenkäynnistyksen jälkeen, joten jos haluaa, että ipforward tulee heti päälle pitää antaa seuraava komento:&lt;br /&gt;
 /sbin/sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
Lisäksi iptables pitää kytkeä päälle, jos se ei ole jo. Tämä onnistuu seuraavalla komennolla:&lt;br /&gt;
 /sbin/chkconfig iptables on&lt;br /&gt;
Nykyään iptables on käytössä käytännössä kaikissa jakeluissa eikä mitään erityissäätöjä tarvitse tehdä sen käyttöönottamista varten.&lt;br /&gt;
&lt;br /&gt;
=== Pakettien estäminen ===&lt;br /&gt;
Tietystä osoitteesta tulevia paketteja voidaan estää iptables-komennoilla joiden syntaksi on seuraavanlainen:&lt;br /&gt;
 iptables -s osoite -A INPUT -j DROP&lt;br /&gt;
Parametri -s tarkoittaa osoitetta, josta paketit tulevat (engl. &amp;lt;i&amp;gt;source&amp;lt;/i&amp;gt;). Osoite voi olla joko IP-osoite (123.345.456.578) tai DNS-nimi (esim. linux.fi). Yksittäisen osoitteen sijaan voidaan antaa myös kokonainen IP-osoiteavaruus käyttäen [[wikipedia:Netmask|verkkomaskia]]: esimerkiksi IP-osoitteet väliltä 192.168.0.0-192.168.0.255 valittaisiin merkinnällä 192.168.0.0/255.255.255.0.&lt;br /&gt;
&lt;br /&gt;
-A tarkoittaa paketin tyyppiä, tässä tapauksessa sisään tulevaa pakettia (&amp;lt;tt&amp;gt;INPUT&amp;lt;/tt&amp;gt;). -j kertoo, mitä paketille tehdään. Tässä tapauksessa se pudotetaan (engl. &amp;lt;i&amp;gt;drop&amp;lt;/i&amp;gt;), eli sitä ei päästetä palomuurin läpi.&lt;br /&gt;
&lt;br /&gt;
Vastaavasti tiettyyn osoitteeseen lähetettävät paketit voitaisiin estää komennolla&lt;br /&gt;
 iptables -d osoite -A OUTPUT -j DROP&lt;br /&gt;
Huomaa, että pakettilähteen (-s) tilalla käytetään nyt pakettien kohdetta -d (engl. &amp;lt;i&amp;gt;destination&amp;lt;/i&amp;gt;). Lisäksi pakettien tyyppi -A on nyt &amp;lt;tt&amp;gt;OUTPUT&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Tarkempaa rajoittamista ===&lt;br /&gt;
Edellä estimme kaikki mahdolliset paketit tiettyyn osoitteeseen. Iptables tarjoaa kuitenkin mahdollisuuden käyttää tarkempia rajoituksia. Esimerkiksi seuraavassa estäisimme kaiken saapuvan [[SSH]]-liikenteen osoitteesta 123.456.789.123 (porttiin 22 kohdistuvan [[TCP]]-protokollaa käyttävän liikenteen).&lt;br /&gt;
 iptables -A INPUT -s 123.456.789.123 -p tcp --dport 22 -j DROP&lt;br /&gt;
Huomaa uudet valitsimet -p (protokolla) ja --dport (kohdeportti, &amp;lt;i&amp;gt;destination port&amp;lt;/i&amp;gt;, voi olla myös alue muodossa alku:loppu). Iptables ymmärtää myös portin numeron sijasta protokollien nimiä, esimerkiksi ssh (portti 22) tai http (80).&lt;br /&gt;
&lt;br /&gt;
=== SYN-paketit ===&lt;br /&gt;
SYN-paketit ovat käytännöllisiä pikku kikkoja, kun haluamme kohdeosoitteen keskustelevan meidän kanssamme vasta siinä vaiheessa kun olemme ensin itse ottaneet yhteyden kohdekoneeseen. Eli paketit estetään jos kohdejärjestelmä aloittaa yhteyden, mutta hyväksytään siinä vaiheessa jos yhteyden aloittaja olemme me. Seuraavassa komennossa meidän tulee määritellä laite, joka on kytköksissä verkkoon josta haluamme estää liikenteen. Tämä tapahtuu kytkimellä -i(interface), jonka jälkeen tulee laitteen &amp;quot;nimi&amp;quot; (yleensä laajakaistajärjestelmissä verkkokortti eth0). Seuraavalla komennolla saamme estettyä kaiken liikenteen tietokoneemme TCP-portteihin jos emme itse ensin ota yhteyttä kohdekoneeseen:&lt;br /&gt;
 iptables -A INPUT -i eth0 -p tcp --syn -j DROP&lt;br /&gt;
&lt;br /&gt;
Näin, entä jos haluamme ajaa esim. http-palvelinta kuten [[Apache]]? Ei huolta, määrittelemme kohdeportiksi kaikki muut portit paitsi TCP/80, jota apache käyttää vakiona. Tämä saadaan aikaan komennolla&lt;br /&gt;
 iptables -A INPUT -i eth0 -p tcp --syn --destination-port ! 80 -j DROP&lt;br /&gt;
&lt;br /&gt;
== Asetusten tallentaminen ja palauttaminen ==&lt;br /&gt;
Iptablesin senhetkiset asetukset saa ulos ajamalla pääkäyttäjänä komennon&lt;br /&gt;
 iptables-save&lt;br /&gt;
, joka tulostaa nykyiset asetukset (käytännössä normaaleita iptables-komentoja ilman iptables-alkuosaa). Toimivat asetukset kannattaakin [[Komentorivin perusteet#putkitus|tallentaa]] tiedostoon:&lt;br /&gt;
 iptables-save &amp;gt; /home/tux/iptables-asetukset&lt;br /&gt;
Jonka jälkeen toimivat asetukset on tarvittaessa helppo palauttaa komennolla&lt;br /&gt;
 iptables-restore /home/tux/iptables-asetukset&lt;br /&gt;
&lt;br /&gt;
== Pikamuuri ==&lt;br /&gt;
Tässä ohjeet yksinkertaisen palomuurin pystyttämiseen:&lt;br /&gt;
&lt;br /&gt;
Ensin säädetään perusasetukset: kaikki sisään tuleva estetään ja ulos menevä sallitaan&lt;br /&gt;
 iptables -P INPUT DROP&lt;br /&gt;
 iptables -P FORWARD DROP&lt;br /&gt;
 iptables -P OUTPUT ACCEPT&lt;br /&gt;
Seuraavaksi sallitaan [[loopback]]-liikenne&lt;br /&gt;
 iptables -A INPUT -i lo -j ACCEPT&lt;br /&gt;
Jos sinulla on lähiverkko, voit sallia liikenteen siinä (oletetaan, että lähiverkon nimiavaruus on 192.168.0.x)&lt;br /&gt;
 iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT &lt;br /&gt;
Tähän kohtaan voidaan avata halutut portit (&#039;&#039;&#039;ÄLÄ AVAA JOS EI OLE TARVETTA&#039;&#039;&#039;)&lt;br /&gt;
 #ssh-portin avaaminen koneen etäkäyttöön (22):&lt;br /&gt;
 iptables -A INPUT -p tcp --dport ssh -j ACCEPT&lt;br /&gt;
 #http-portin avaaminen web-palvelinta varten (80):&lt;br /&gt;
 iptables -A INPUT -p tcp --dport http -j ACCEPT &lt;br /&gt;
Estetään liikenne private-portteihin&lt;br /&gt;
 iptables -A INPUT -p tcp --dport 0:1023 -j DROP&lt;br /&gt;
 iptables -A INPUT -p udp --dport 0:1023 -j DROP&lt;br /&gt;
Estetään SYN-paketit ja ICMP-liikenne&lt;br /&gt;
 iptables -A INPUT -p tcp --syn -j DROP&lt;br /&gt;
 iptables -A INPUT -p icmp -j DROP&lt;br /&gt;
Sallitaan kaikki &amp;quot;takaisin palaava&amp;quot; liikenne&lt;br /&gt;
 iptables -A INPUT -p TCP -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
 iptables -A INPUT -p UDP -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
Lopuksi estetään loput&lt;br /&gt;
 iptables -A INPUT -j DROP&lt;br /&gt;
&lt;br /&gt;
== Esimerkkejä ==&lt;br /&gt;
&lt;br /&gt;
Tämän pienen iptables-skriptin avulla saat Linux-koneen reitittämään netin muille koneille.&lt;br /&gt;
&lt;br /&gt;
Koneessa on 2 verkkokorttia:&lt;br /&gt;
*eth0 = Lähiverkko&lt;br /&gt;
*eth1 = Internet&lt;br /&gt;
Lähiverkon ip-avaruus on 192.168.x.x&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 &lt;br /&gt;
 #Muuttujat&lt;br /&gt;
 LAN=eth0&lt;br /&gt;
 LAN_IP=192.168.0.0/255.255.0.0&lt;br /&gt;
 WAN=eth1&lt;br /&gt;
 IPTABLES=/sbin/iptables&lt;br /&gt;
 &lt;br /&gt;
 ###########################################################&lt;br /&gt;
 ###################### Perustaulukko ######################&lt;br /&gt;
 ###########################################################&lt;br /&gt;
 &lt;br /&gt;
 #Putsataan taulukko&lt;br /&gt;
 ${IPTABLES} -F&lt;br /&gt;
 ${IPTABLES} -X&lt;br /&gt;
 &lt;br /&gt;
 #Taulukoiden perussäännöt&lt;br /&gt;
 ${IPTABLES} -P FORWARD DROP&lt;br /&gt;
 ${IPTABLES} -P INPUT DROP&lt;br /&gt;
 ${IPTABLES} -P OUTPUT ACCEPT&lt;br /&gt;
 &lt;br /&gt;
 #---------- INPUT ----------#&lt;br /&gt;
 ${IPTABLES} -A INPUT -i lo -s 127.0.0.1 -j ACCEPT&lt;br /&gt;
 ${IPTABLES} -A INPUT -i ${LAN} -s ${LAN_IP} -j ACCEPT&lt;br /&gt;
 #Salli SSH-yhteys ulkopuolelta&lt;br /&gt;
 #${IPTABLES} -A INPUT -p tcp --dport ssh -j ACCEPT&lt;br /&gt;
 ${IPTABLES} -A INPUT -i ${WAN} -p tcp --dport 0:1023 -j DROP&lt;br /&gt;
 ${IPTABLES} -A INPUT -i ${WAN} -p udp --dport 0:1023 -j DROP&lt;br /&gt;
 ${IPTABLES} -A INPUT -i ${WAN} -p tcp --syn -j DROP&lt;br /&gt;
 ${IPTABLES} -A INPUT -i ${WAN} -p icmp -j DROP&lt;br /&gt;
 ${IPTABLES} -A INPUT -i ${WAN} -p TCP -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
 ${IPTABLES} -A INPUT -i ${WAN} -p UDP -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
 ${IPTABLES} -A INPUT -j DROP&lt;br /&gt;
 &lt;br /&gt;
 #---------- FORWARD ----------# &lt;br /&gt;
 ${IPTABLES} -A FORWARD -i ${WAN} -p tcp --dport 0:1023 -j DROP&lt;br /&gt;
 ${IPTABLES} -A FORWARD -i ${WAN} -p udp --dport 0:1023 -j DROP&lt;br /&gt;
 ${IPTABLES} -A FORWARD -i ${WAN} -p tcp --syn -j DROP&lt;br /&gt;
 ${IPTABLES} -A FORWARD -i ${WAN} -p icmp -j DROP&lt;br /&gt;
 ${IPTABLES} -A FORWARD -i ${LAN} -o ${WAN} -s ${LAN_IP} -j ACCEPT&lt;br /&gt;
 ${IPTABLES} -A FORWARD -i ${WAN} -o ${LAN} -d ${LAN_IP} -p TCP -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
 ${IPTABLES} -A FORWARD -i ${WAN} -o ${LAN} -d ${LAN_IP} -p UDP -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
 ${IPTABLES} -A FORWARD -j DROP&lt;br /&gt;
 &lt;br /&gt;
 #---------- OUTPUT ----------#&lt;br /&gt;
 &lt;br /&gt;
 ##########################################################&lt;br /&gt;
 ###################### NAT-taulukko ######################&lt;br /&gt;
 ##########################################################&lt;br /&gt;
 &lt;br /&gt;
 #Putsataan taulukko&lt;br /&gt;
 ${IPTABLES} -t nat -F&lt;br /&gt;
 ${IPTABLES} -t nat -X&lt;br /&gt;
 &lt;br /&gt;
 #Taulukoiden perussäännöt&lt;br /&gt;
 ${IPTABLES} -t nat -P PREROUTING ACCEPT&lt;br /&gt;
 ${IPTABLES} -t nat -P POSTROUTING ACCEPT&lt;br /&gt;
 ${IPTABLES} -t nat -P OUTPUT ACCEPT&lt;br /&gt;
 &lt;br /&gt;
 #---------- PREROUTING ----------#&lt;br /&gt;
 #Tänne uudelleenohjeukset&lt;br /&gt;
 #Call of Duty &lt;br /&gt;
 #${IPTABLES} -t nat -A PREROUTING -p udp --dport 28960 -i ${WAN} -j DNAT --to 192.168.x.x&lt;br /&gt;
 #web-serveri&lt;br /&gt;
 #${IPTABLES} -t nat -A PREROUTING -p tcp --dport http -i ${WAN} -j DNAT --to 192.168.x.x&lt;br /&gt;
 &lt;br /&gt;
 #---------- POSTROUTING ----------#&lt;br /&gt;
 ${IPTABLES} -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Ongelmatilanteita ==&lt;br /&gt;
Joissain jakeluissa käytössä olevat verkkoyhteyden hallintatyökalut saattavat aiheuttaa ongelmia, jos iptablesia käytetään käsin. Esimerkiksi [[Ubuntu]]n käyttämä [[NetworkManager]] on tällainen. Lisätietoja löytyy [https://help.ubuntu.com/community/IptablesHowTo Ubuntun ohjeista].&lt;br /&gt;
&lt;br /&gt;
Kannattaa myös huolehtia, ettei jakelusi oma palomuuriasetusohjelma (esimerkiksi [[YaST]] [[openSUSE]]ssa tai [[system-config-firewall]] [[Fedora]]ssa) aiheuta ristiriitaa oman iptables-skriptisi kanssa. Käytännössä kannattaa joko poistaa palomuuriasetusohjelma kokonaan käytöstä tai ainakin huolehtia siitä, että sen tuottama iptables-skripti ajetaan [[GNU/Linuxin käynnistysprosessi|käynnistyksen]] yhteydessä ([[init]]) ennen omaa skriptiäsi. Sama pätee luonnollisesti myös [[Firestarter]]in ja [[Shorewall]]in kaltaisiin ulkoisiin palomuuriasetustyökaluihin.&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
*[[Verkkoliitynnät]]&lt;br /&gt;
&lt;br /&gt;
== Aiheesta muualla ==&lt;br /&gt;
*[http://gentoo-wiki.com/HOWTO_Iptables_for_newbies Iptables-opas] Gentoo-wikissä&lt;br /&gt;
*[https://help.ubuntu.com/community/IptablesHowTo Ubuntun iptables-opas]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;br /&gt;
[[Luokka:Verkko]]&lt;br /&gt;
[[Luokka:Tietoturva]]&lt;br /&gt;
[[Luokka:Ylläpitotyökalut]]&lt;br /&gt;
[[Luokka:Komentorivin perustyökalut]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=SSH&amp;diff=30733</id>
		<title>SSH</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=SSH&amp;diff=30733"/>
		<updated>2010-02-16T11:55:04Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: spesifimpi avaus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SSH eli Secure SHell on alunperin suomalaisen Tatu Ylösen kehittämä etäkäyttöohjelmisto, jolla voidaan ottaa [[wikipedia:fi:salaus|salattuja]] yhteyksiä järjestelmästä toiseen. SSH:sta löytyy avoin [[OpenSSH]]-toteutus, joka on peräisin [[OpenBSD]]-projektista. [[PuTTY]] on [[X|X:ssä]] toimiva ssh-asiakasohjelma UNIX-järjestelmille ja Windowsille. SSH on käytännössä täysin korvannut käytössä aikaisemman salaamattoman RSH (Remote SHell) -protokollan.&lt;br /&gt;
&lt;br /&gt;
== Peruskäyttö ==&lt;br /&gt;
Monissa jakeluissa tulee mukana ssh-asiakasohjelma komentoriville, jolloin ssh-yhteyden voi ottaa palvelimelle yksinkertaisesti komennolla&lt;br /&gt;
 ssh minun.palvelin.example&lt;br /&gt;
Tällöin kirjautumista yritetään samalla tunnuksella, millä järjestelmään on kirjauduttu sisälle. Muulla tunnuksella yhdistäminen onnistuu seuraavasti&lt;br /&gt;
 ssh kayttajatunnus@minun.palvelin.example&lt;br /&gt;
&lt;br /&gt;
Mikäli yllä olevan komennon kirjoittaminen toistuvasti tuntuu työläältä, on mahdollista luoda ssh:n asetustiedostoon (&amp;lt;tt&amp;gt;~/.ssh/config&amp;lt;/tt&amp;gt;) oma profiili yhteyttä varten. Tämä onnistuu lisäämällä tiedostoon rivit:&lt;br /&gt;
 Host lyhytnimi minun.palvelin.example&lt;br /&gt;
 HostName minun.palvelin.example&lt;br /&gt;
 User kayttajatunnus&lt;br /&gt;
Host määrittelee komentoriville syötetyt aliakset, jotka käyttävät tätä profiilia. Yllä olevaa profiilia käytettäessä seuraavat komennot saavat aikaan saman lopputuloksen:&lt;br /&gt;
 ssh kayttajatunnus@minun.palvelin.example&lt;br /&gt;
 ssh minun.palvelin.example&lt;br /&gt;
 ssh lyhytnimi&lt;br /&gt;
&lt;br /&gt;
== Graafiset ohjelmat ==&lt;br /&gt;
Jos halutaan ajaa [[X]]-ohjelmia SSH:n kautta on komentoon sisällyttävä parametri &amp;lt;tt&amp;gt;-X&amp;lt;/tt&amp;gt; ([[#X:n tietoturva|tietoturvasyistä]] tämä ei yleensä ole oletuksena), esimerkiksi näin:&lt;br /&gt;
 ssh -X guru@linuxburken.firma.example&lt;br /&gt;
&lt;br /&gt;
Usein erityisesti X-ohjelmien ajossa pullonkaulaksi muodostuu hidas yhteys. Hitaan yhteyden aiheuttamia ongelmia voidaan kompensoida pakkaamalla tiedonsiirto:&lt;br /&gt;
 ssh -X -C guru@linuxburken.firma.example&lt;br /&gt;
&lt;br /&gt;
Jotta graafisten ohjelmien käyttäminen onnistuisi, on sshd:n (etäkoneen) asetustiedostossa (&amp;lt;tt&amp;gt;/etc/ssh/sshd_config&amp;lt;/tt&amp;gt;) oltava rivi&lt;br /&gt;
 ForwardX11 yes&lt;br /&gt;
Oletuksena tämä arvo on &amp;lt;tt&amp;gt;no&amp;lt;/tt&amp;gt;, vaikkakaan tällä ei ole suurempaa merkitystä &#039;&#039;palvelinkoneen&#039;&#039; turvallisuudelle.&lt;br /&gt;
&lt;br /&gt;
Jotta yhteystyö, esimerkiksi tekstin kopioiminen leikepöydän kautta, toimisi normaaliin tapaan paikallisten ja palvelimella ajettavien sovellusten välillä joutuu lisäksi hyväksymään &amp;quot;ForwardX11Trusted&amp;quot;, komentorivillä &amp;lt;code&amp;gt;-Y&amp;lt;/code&amp;gt;. Sekä tavallinen että varsinkin luotettu X-edelleenohjaus antaa vieraalle koneelle mahdollisuuden käyttää hyväkseen X-sovellusten välistä melko heikkoa tietoturvaa. Katso [[#X:n tietoturva|X:n tietoturva]] alla.&lt;br /&gt;
&lt;br /&gt;
Oletusasetukset ForwardX11 ja ForwardX11Trusted voi asettaa tiedostoissa /etc/ssh_config ja /etc/.ssh/config, haluttaessa kone- ja verkkokohtaisesti:&lt;br /&gt;
&lt;br /&gt;
 Host *.luotettuverkko.example.org,omakone.example.net&lt;br /&gt;
   ForwardX11 yes&lt;br /&gt;
   ForwardX11Trusted yes&lt;br /&gt;
 Host muu-x-palvelin.example.com&lt;br /&gt;
   ForwardX11 yes&lt;br /&gt;
   ForwardX11Trusted no&lt;br /&gt;
 Host *&lt;br /&gt;
   ForwardX11 no&lt;br /&gt;
   ForwardX11Trusted no&lt;br /&gt;
&lt;br /&gt;
== Yhteyksien uusiokäyttö ==&lt;br /&gt;
Mikäli samalle palvelimelle otetaan useampia yhteyksiä, voidaan yhtä yhteyksistä käyttää niin kutsuttuna isäntäyhteytenä, jolloin muut yhteydet otetaan sen kautta. Tällöin salasana on annettava vain kerran isäntäyhteyttä avatessa ja muiden yhteyksien ottaminen hoituu erittäin nopeasti.&lt;br /&gt;
&lt;br /&gt;
Isäntäyhteyttä otettaessa ssh:lle on annettava parametri &amp;lt;tt&amp;gt;-M&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 ssh -M mun.palvelin.example&lt;br /&gt;
&lt;br /&gt;
Jonka jälkeen toinen yhteys voidaan ottaa tavalliseen tapaan&lt;br /&gt;
 ssh mun.palvelin.example&lt;br /&gt;
Eikä salasanaa enää kysytä.&lt;br /&gt;
&lt;br /&gt;
Jotta isäntäyhteyksien käyttö onnistuisi, on ssh:n asetustiedostoon (&amp;lt;tt&amp;gt;~/.ssh/config&amp;lt;/tt&amp;gt;) lisättävä rivit&lt;br /&gt;
 Host * &lt;br /&gt;
 ControlPath ~/.ssh/ctl-%r-%h-%p &lt;br /&gt;
 ControlMaster auto &lt;br /&gt;
&lt;br /&gt;
Ominaisuus löytyy OpenSSH:n versiosta 4.2 ja sitä uudemmista.&lt;br /&gt;
&lt;br /&gt;
== Tunnistaminen avainparilla ==&lt;br /&gt;
Salasanatunnistuksen ohella varteenotettava tapa autentikoida yhteys palvelimelle on avainparimenettely. Siinä asiakaskoneella luodaan avainpari, jonka yksityinen osa jätetään omalle koneelle, ja julkinen osa siirretään kaikille niille koneille, joilla avainparitunnistusta halutaan käyttää. Tässä menettelyohjeet:&lt;br /&gt;
&lt;br /&gt;
*Luodaan avainpari ssh-keygen -ohjelmalla&lt;br /&gt;
&lt;br /&gt;
 ssh-keygen -t rsa&lt;br /&gt;
&lt;br /&gt;
*Tässä vaiheessa ssh-keygen kysyy salasanaa avaimelle ja mahdollisesti polkua. Oletuspolkua (~/.ssh/id_rsa) ei yleensä pidä muuttaa, mutta salasana lisää turvallisuutta oleellisesti, jos joku pääsee käsiksi avaintiedostoon. Salasana saa olla mielivaltaisen pitkä. Tiedoston &amp;lt;tt&amp;gt;id_rsa&amp;lt;/tt&amp;gt; turvallisuudesta on pidettävä huolta, sillä sen avulla kuka tahansa voi kirjautua käyttämillesi palvelimille tunnuksillasi (murrettuaan mahdollisen salasanan).&lt;br /&gt;
*Sitten kopioidaan julkinen osa kaikille palvelimille missä tätä avainparia halutaan hyödyntää. Huomaa, että &amp;lt;tt&amp;gt;authorized_keys&amp;lt;/tt&amp;gt;-tiedostossa jokaisella rivillä määritetään yksi avain. Jos et ole aiemmin käyttänyt tätä menetelmää, tiedostoa ei ole, ja oman julkisen avaimen kopioiminen etäkoneen &amp;lt;tt&amp;gt;authorized_keys&amp;lt;/tt&amp;gt;-tiedostoksi ei tuota ongelmia.&lt;br /&gt;
 [[scp]] ~/.ssh/id_rsa.pub palvelin:/home/kayttaja/.ssh/authorized_keys&lt;br /&gt;
Mikäli sinulla on jo ennestään etäkoneessa &amp;lt;tt&amp;gt;~/.ssh/authorized_keys&amp;lt;/tt&amp;gt;-tiedosto, voit komentaa näin:&lt;br /&gt;
 [[cat]] ~/.ssh/id_rsa.pub | ssh käyttäjä@etäkone &#039;[[cat]] &amp;gt;&amp;gt; ~/.ssh/authorized_keys&#039;&lt;br /&gt;
&lt;br /&gt;
*Nyt voit kirjautua kaikille palvelimille, joille olet julkisen avaimesi kopioinut käyttämättä palvelimen salasanaa. Salasanan ei siis enää tarvitse olla helposti muistettava &amp;amp;ndash; ja salasanalla kirjautumisen sshd:n kautta voi kieltää kokonaan. Käyttäen ohjelmaa ssh-agent säästytään myös avaintiedoston salasanan antamisesta, paitsi kerran X- tai pääteistunnon alussa, ssh-agentin käynnistämisen yhteydessä.&lt;br /&gt;
&lt;br /&gt;
Jos haluaa kirjautua automaattisesti, esimerkiksi cron-työn yhteydessä, joutuu käyttämään salasanatonta avaintiedostoa. Tähän käyttöön voi luoda rinnakkaisen avaimen, jota pidetään eri tiedostossa (johon viitataan ssh:n vivulla &amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt;) ja avaimen valtuuksia voi rajoittaa laittamalla tiedoston authorized_keys tämän avaimen kohdalle rivin alkuun &amp;quot;optioita&amp;quot;, esimerkiksi (huomaa pilkkujen, lainausmerkkien ja välilyöntien käyttö):&lt;br /&gt;
 from=&amp;quot;*.kotiverkko.example.org,työkoneeni.example.com&amp;quot;,no-port-forwarding,no-X11-forwarding jatässäitsejulkinenavainkaikkinensa&lt;br /&gt;
&lt;br /&gt;
== Tunneli ==&lt;br /&gt;
SSH:n avulla voi tunneloida minkä tahansa TCP-portin käytettäväksi verkon yli. Tämä tapahtuu sovelluksille läpinäkyvästi, joten se tarjoaa hienon mahdollisuuden parantaa &amp;amp;ndash; tai huonontaa &amp;amp;ndash; tietoturvaa tilanteissa, joissa tietyn sovelluksen muokkaaminen ei ole mahdollista tai käytännöllistä.&lt;br /&gt;
&lt;br /&gt;
Tässä esitellään yksittäisten porttien ohjausta SSH-yhteyden kautta. Tämä riittää yksinkertaisimmissa tapauksissa. IP-tunnelien muodostaminen SSH-yhteyden kautta on myös mahdollista. Lisätietoja asiasta saatavilla artikkelissa [[SSH-tunneli]].&lt;br /&gt;
&lt;br /&gt;
Seuraavassa esimerkissä tunneloidaan paikallisen koneen ([[localhost]]) portti &amp;lt;tt&amp;gt;6060&amp;lt;/tt&amp;gt; SSH:lla niin, että sen kautta voi käyttää etäkoneen porttia &amp;lt;tt&amp;gt;23&amp;lt;/tt&amp;gt;.&lt;br /&gt;
 ssh -L 6060:localhost:23 etäkone&lt;br /&gt;
Ottamalla nyt yhteyden paikallisella koneella porttiin &amp;lt;tt&amp;gt;6060&amp;lt;/tt&amp;gt;, yhteys ohjautuu SSH-tunnelin yli etäkoneen porttiin &amp;lt;tt&amp;gt;23&amp;lt;/tt&amp;gt;, [[telnet]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tunnelia ei ole pakko tehdä localhostiin, vaan mikä tahansa kone käy. Näin voit esimerkiksi päästä käsiksi sisäverkkoihin, joihin et suoraan Internetistä pääse. Esimerkki: &lt;br /&gt;
 ssh -L 123:192.168.6.12:1337 etäkone&lt;br /&gt;
&lt;br /&gt;
=== Käänteinen tunneli ===&lt;br /&gt;
Käänteisen tunnelin idea on sama kuin normaalinkin tunnelin, mutta se käynnistetään toisesta päästä. Käänteinen tunneli mahdollistaa vaikkapa palomuurin takana olevan koneen etäylläpidon. Seuraavassa esimerkissä tunneloidaan paikallisen koneen portti &amp;lt;tt&amp;gt;23&amp;lt;/tt&amp;gt; SSH:lla niin, että se on käytettävissä etäkoneelta portissa &amp;lt;tt&amp;gt;1337&amp;lt;/tt&amp;gt;.&lt;br /&gt;
 ssh -R 1337:localhost:23 etäkone&lt;br /&gt;
&lt;br /&gt;
Ottamalla nyt yhteyden etäkoneella porttiin &amp;lt;tt&amp;gt;1337&amp;lt;/tt&amp;gt;, yhteys ohjautuu SSH-tunnelin ja mahdollisen palomuurin läpi paikalliselle koneelle porttiin &amp;lt;tt&amp;gt;23&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Huomio tunneleita rakentaessasi, että kuuntelevan [[pistoke|pistokkeen]] (engl. socket) asettaminen porttia &amp;lt;tt&amp;gt;1024&amp;lt;/tt&amp;gt; alhaisempien portteihin vaatii kyseisessä järjestelmässä [[root]]-oikeudet.&lt;br /&gt;
&lt;br /&gt;
==Tietoturva==&lt;br /&gt;
SSH-yhteys on salattu, mutta ei pidä tuudittautua valheellisen turvallisuuden tunteeseen, sillä erilaisia hyökkäyskeinoja on olemassa. Lue artikkelista [[SSH-turvatoimet]] vinkkejä SSH-palvelimesi turvaamiseen.&lt;br /&gt;
&lt;br /&gt;
Salaus auttaa siihen, ettei verkkoa passiivisesti salakuunteleva pysty seuraamaan liikennettä ja ettei sitä pystytä muokkaamaan. Edellinen voi myös olla tietoturvaongelma, sillä yrityksen palomuurikaan ei pysty erottamaan ongelmallista liikennettä sallittusta.&lt;br /&gt;
&lt;br /&gt;
===Koneiden avaimet===&lt;br /&gt;
&lt;br /&gt;
SSH estää koneitten avainten avulla vieraan koneen esiintymisen luotettuna palvelimena (nimipalvelinhyökkäysten tms. avulla). ssh varoittaa, jos avaimet eivät täsmää. Varoituksesta ei ole hyötyä, jos siitä ei välitä, joten on oleellista kopioida koneitten avaimet /etc/ssh_host*_key.pub omalle koneelle tiedostoon /etc/ssh/ssh_known_hosts tai ~/.ssh/known_hosts.&lt;br /&gt;
Avainriville pitää lisätä myös koneesta mahdollisesti käytettävät aliakset&lt;br /&gt;
 kone.example.com,kone,alias,alias.example.com,192.168.0.1 itseavainkaikkinensa&lt;br /&gt;
&lt;br /&gt;
Varoituksen yhteydessä ssh kertoo koneen avaimen &amp;quot;sormenjäljen&amp;quot;, jonka voi verrata oikean avaimen sormenjälkeen jopa puhelimitse. Jos vain yhden koneen kanssa on ongelmia, ssh-yhteyden voi ottaa toiselle koneelle toiseen verkkoon ja yrittää yhteyttä sitä kautta. Jos tältä koneelta katsottuna vieraan koneen sormenjälki on sama kuin omastakin koneesta katsottuna, kyseessä ei ole paikallinen nimipalvelinhuijaus.&lt;br /&gt;
&lt;br /&gt;
===Murtautuminen===&lt;br /&gt;
&lt;br /&gt;
Se, että ssh-liikenne on salattua, ei estä murtautumaasta ssh-palvelimen kautta suoraan. Itse palvelimessa ei ole ollut kovin paljon reikiä, mutta heikkoja salasanoja voi hyödyntää ssh-palvelimen kautta. Joissakin [[jakelu]]issa palvelin on oletuksena päällä, koska koneita on tarkoitettu etäylläpidettäviksi. Tällöin on tärkeää rajoittaa miltä koneilta ja mille tunnuksille ssh:lla pystyy kirjautumaan ja varmistamaan, että näillä tunnuksilla on hyvät salasanat &amp;amp;ndash; ellei salasanalla kirjautumista ssh:lla estetä kokonaan (katso [[#Tunnistaminen avainpareilla|tunnistaminen avainpareilla]] yllä).&lt;br /&gt;
&lt;br /&gt;
Katso myös [[SSH-turvatoimet]].&lt;br /&gt;
&lt;br /&gt;
===X:n tietoturva===&lt;br /&gt;
&lt;br /&gt;
Samalla [[X]]-palvelimella ajettavat ohjelmat luottavat yleensä toisiinsa ja X-palvelin luottaa ohjelmiin. Jos ohjelma niin haluaa se pystyy esimerkiksi valtaamaan leikepöydän juuri ennen sen sisällön kopioimista komentoriville ja siten ajamaan mielivaltaisia komentoja, tai luomaan läpinäkyvän näytön kokoisen ikkunan ja sen kautta salakuuntelemaan näppäimistöä. Tämä ei yleensä ole ongelma, sillä jos jokin ajettava ohjelma on trojan hevonen, se pystyy myös käyttämään tunnuksen oikeuksia suoraan. Verkon yli ajettaessa yhdellä koneella vallatulla tunnuksella voi kuitenkin murtautua myös samaa X-palvelinta käyttäville muille koneille.&lt;br /&gt;
&lt;br /&gt;
Jotta voisi käyttää myös heikomman tietoturvan koneita tai koneita, joiden ylläpitoon ei luota, ssh ei yleensä pyytämättä anna toisella koneella ajettavien ohjelmien käyttää paikallista X-palvelinta. Nykyisissä X-palvelimissa on myös mahdollista rajoittaa X:n käyttöä niin, että jotkut, tässä tilanteessa erityisen vaarallisiksi huomatut toiminnot eivät ole vieraan ohjelman käytettävissä.&lt;br /&gt;
&lt;br /&gt;
Jos etäyhteydessä ei ole tarkoituksena ajaa graafisia ohjelmia, X-yhteyttä ei siis kannata muodostaa. Jos käyttää graafisia ohjelmia, mutta epäilee etäkoneen tietoturvaa, X:n voi sallia vain kohtuullisen turvaallisesti koetuin osin.&lt;br /&gt;
 ssh -x kone-ilman-x-ohjelmia.example.org&lt;br /&gt;
 ssh -X kone-jossa-x-ohjelmia.example.org&lt;br /&gt;
 ssh -X -Y kone-johon-luottaa.example.org&lt;br /&gt;
&lt;br /&gt;
==SSH välityspalvelimen läpi==&lt;br /&gt;
SSH-yhteydet voidaan myös yhdistää HTTP-välityspalvelimen, kuten [[Squid]]in läpi. Seuraava asetus vaatii Corkscrew-ohjelman, joka löytyy useimpien jakelupakettien ohjelmavarastosta.&lt;br /&gt;
&lt;br /&gt;
Lisää &amp;lt;tt&amp;gt;~/.ssh/config&amp;lt;/tt&amp;gt;-tiedostoon seuraavat rivit vaihtaen &amp;lt;tt&amp;gt;cache.palvel.in 8080&amp;lt;/tt&amp;gt;:n joksikin muuksi:&lt;br /&gt;
&amp;lt;pre&amp;gt;Host *&lt;br /&gt;
  ProxyCommand corkscrew cache.palvel.in 8080 %h %p&amp;lt;/pre&amp;gt;&lt;br /&gt;
Jos haluat esimerkiksi vain fi-, org- ja net-domainit menemään välityspalvelimen läpi, muuta Host-asetus &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;:n sijasta &amp;lt;tt&amp;gt;*.fi *.org *.net&amp;lt;/tt&amp;gt;:ksi.&lt;br /&gt;
&lt;br /&gt;
==Käyttöesimerkki: varakopiot verkon yli==&lt;br /&gt;
Varakopioi kotisivusi toisen koneen kotihakemistosta ssh:lla&lt;br /&gt;
&lt;br /&gt;
  ssh toinen.kone.fi &#039;cd public_html &amp;amp;&amp;amp; tar -cjvf - .&#039; | cat &amp;gt; kotisivut.tar.bz2&lt;br /&gt;
&lt;br /&gt;
Palauta hakemistorakenne takaisin&lt;br /&gt;
&lt;br /&gt;
  cat kotisivut.tar.bz2 | ssh toinen.kone.fi &#039;cd public_html &amp;amp;&amp;amp; tar xjvf -&#039;&lt;br /&gt;
&lt;br /&gt;
Vastaava [[Varmuuskopiointi#Rsync|perusteellisempi esimerkki]] löytyy artikkelissa varmuuskopioinnista.&lt;br /&gt;
&lt;br /&gt;
==Käyttöesimerkki: graafinen VNC-yhteys kahden palomuurin takana olevan koneen välille ==&lt;br /&gt;
Koneet A ja B ovat [[palomuuri]]en takana, kone C ei. Tarkoituksena nähdä koneen A näytöllä koneen B näytön näkymä [[VNC#Yhdist.C3.A4minen_olemassaolevaan_X-istuntoon|VNC-yhteyden]]  yli.&lt;br /&gt;
&lt;br /&gt;
Kone A ottaa ensiksi yhteyden koneeseen C tunneloiden koneen C portin 5903 paikalliseen porttiin 5904:&lt;br /&gt;
  ssh ckayttaja@ckone.com -L 5904:localhost:5903&lt;br /&gt;
&lt;br /&gt;
Tämän jälkeen kone B ottaa yhteyden koneeseen C tunneloiden koneen C portti 8001 koneen B porttiin 22 (SSH):&lt;br /&gt;
  ssh -R 8001:localhost:22 ckayttaja@ckone.com&lt;br /&gt;
&lt;br /&gt;
Tämän jälkeen käyttäjä A ottaa koneelta C yhteyden koneeseen B tunneloiden koneen B portin 5900(VNC) koneen C porttiin 5903:&lt;br /&gt;
  ssh bkayttaja@localhost -p 8001 -L 5903:localhost:5900&lt;br /&gt;
&lt;br /&gt;
Nyt A käynnistää VNC:n koneen B porttiin 5900&lt;br /&gt;
  x11vnc&lt;br /&gt;
&lt;br /&gt;
Ja tämä B-koneen portti 5900 tunneloituu noin neljän portin läpi koneen A porttiin 5904, jolloin A saa VNC:n käyntiin:&lt;br /&gt;
  vncviewer localhost:5904&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
*[[SSH-turvatoimet]]&lt;br /&gt;
*[[ClusterSSH]]&lt;br /&gt;
*[[SFTP]]&lt;br /&gt;
*[[SCP]]&lt;br /&gt;
*[[Telnet]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
* [[wikipedia:fi:SSH|SSH Wikipediassa]]&lt;br /&gt;
* [http://www.openssh.com/ OpenSSH]&lt;br /&gt;
* [http://www.chiark.greenend.org.uk/~sgtatham/putty/ PuTTY]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Etäkäyttö]]&lt;br /&gt;
[[Luokka:Verkko]]&lt;br /&gt;
[[Luokka:Palvelimet]]&lt;br /&gt;
[[Luokka:Tietoturva]]&lt;br /&gt;
[[Luokka:Komentorivin erikoisohjelmat]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Videon-_ja_%C3%A4%C3%A4nenk%C3%A4sittely%C3%A4_Linuxilla&amp;diff=30727</id>
		<title>Videon- ja äänenkäsittelyä Linuxilla</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Videon-_ja_%C3%A4%C3%A4nenk%C3%A4sittely%C3%A4_Linuxilla&amp;diff=30727"/>
		<updated>2010-02-15T21:16:24Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: kuvaa ei ole&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Videoiden editointi ja äänenkäsittely tietokoneella ovat hyödyllisiä ja mielenkiintoisia toimintoja. &lt;br /&gt;
Tässä artikkelissa esitellään helppokäyttöisiä peruskäyttöön sopivia ohjelmia. &lt;br /&gt;
&lt;br /&gt;
Videon- ja äänenkäsittely tietokoneella on nykyään arkipäivää. Perinteisen kuva- ja äänimateriaalin siirtäminen digitaaliseen, tietokoneella käsiteltävään muotoon tuo monipuolisia mahdollisuuksia niiden muokkaamiseen ja soveltamiseen. Esimerkiksi itsekuvattuja videoita voidaan siirtää tietokoneelle leikattavaksi ja tallennettavaksi esimerkiksi DVD-levylle tai verkossa levittämistä varten. Samalla tavoin omia ääninauhoituksia tai musiikkia voidaan tehdä ja muokata lähes rajattomasti ja lisätä niihin erilaisia tehosteita.&lt;br /&gt;
&lt;br /&gt;
Seuraavassa on esitelty ohjelmia, jotka soveltuvat hyvin kevyeen perusvideoeditointiin ja äänenkäsittelyyn. Näiden lisäksi saatavilla on myös useita muita ohjelmistoja, joiden ominaisuudet vaihtelevat käyttötarkoitusten mukaan aina vaativampaan ammattikäyttöön asti.&lt;br /&gt;
&lt;br /&gt;
==Kino==&lt;br /&gt;
Pääartikkeli: [[Kino]]&lt;br /&gt;
[[Kuva:Kino.png|250px|right|thumb|Kuvakaappaus Kino-ohjelmasta]]&lt;br /&gt;
&lt;br /&gt;
Kino on kevyeen videoeditointiin suunnattu luotettava ja helppokäyttöinen ohjelma. Kinon avulla voidaan videot helposti siirtää tietokoneelle, muokata ja lopuksi tallentaa DVD-levylle siirtämistä varten. Kino osaa hyödyntää tavallisimpia DV-digitaalivideokameroita, joilla kuvattua materiaalia voidaan siirtää muokattavaksi tietokoneelle.&lt;br /&gt;
&lt;br /&gt;
Kinon käyttöön on suositeltavaa olla erillinen ja riittävän tehokas työasema, jossa on reilusti tallennustilaa. Esimerkiksi palvelinkeskeiseen päätejärjestelmäkäyttöön Kino ei välttämättä sovellu.&lt;br /&gt;
&lt;br /&gt;
Kinossa videotiedostot sijoitetaan aikajanalle jossa videoita voidaan leikata ja yhdistellä. Ohjelmassa videoihin voidaan lisätä esimerkiksi omia tekstejä sekä pieniä tehosteita.&lt;br /&gt;
&lt;br /&gt;
Ohjelman suurimpana puutteena on, että se ei tue päällekkäisiä video- tai ääniraitoja. Peruseditoinnissa tämä ei yleensä ole kuitenkaan ongelma. Kinon kehityksessä korostuu erityisesti pyrkimys ohjelman vakauteen ja tehokkuuteen, mutta uusia ominaisuuksia siihen on ajanmyötä luvassa.&lt;br /&gt;
&lt;br /&gt;
==Kdenlive==&lt;br /&gt;
Pääartikkeli: [[Kdenlive]]&lt;br /&gt;
[[Kuva:Kdenlive.png|250px|right|thumb|Kuvakaappaus Kden live-ohjelmasta]]&lt;br /&gt;
&lt;br /&gt;
==Cinelerra==&lt;br /&gt;
Pääartikkeli: [[Cinelerra]]&lt;br /&gt;
&lt;br /&gt;
==Audacity==&lt;br /&gt;
Pääartikkeli: [[Audacity]]&lt;br /&gt;
[[Kuva:Audacity.png|250px|right|thumb|Kuvakaappaus Audacity-ohjelmasta]]&lt;br /&gt;
&lt;br /&gt;
Audacity on äänen muokkaamiseen erikoistunut sovellus. Sen avulla voidaan tehdä omia äänityksiä esimerkiksi mikrofonin kautta tai esimerkiksi muokata valmiita äänitiedostoja. Äänet esitetään Audacityssä aikajanalla olevana kuvaajana ja niiden muokkaaminen ohjelmassa tapahtuu monista ohjelmista tutulla &amp;quot;kopioi, leikkaa ja liimaa&amp;quot; -tyylillä. Äänikuvaajasta siis määritetään hiirellä alueita joita halutaan poistaa tai esimerkiksi siirtää johonkin muuhun kohtaan.&lt;br /&gt;
&lt;br /&gt;
Audacityssä on mahdollista myös toistaa useita ääniä päällekäin sijoittamalla ne omille ääniraidoilleen. Tällöin esimerkiksi itse tehtyyn kuunnelmaan voidaan helposti lisätä puheen taustalle musiikkia. Puhe sijaitsisi tällöin omalla kanavallaan ja musiikki omallaan.&lt;br /&gt;
&lt;br /&gt;
Audacity mahdollistaa myös äänen muokkaamisen erilaisten tehosteiden avulla. Äänen voimakkuutta, sävyä ja muita piirteitä voidaan muokata varsin vapaasti. Samalla äänitiedostoihin voidaan tehdä erilaisia &amp;quot;feidauksia&amp;quot; joissa esimerkiksi ääni häivytetään hiljalleen pois tai lisätään siihen kaikua.&lt;br /&gt;
&lt;br /&gt;
Koulukäytössä Audacity soveltuu ominaisuuksiensa puolesta esimerkiksi kuunnelmien, esinauhoitettujen päivänavausten tai vaikka oman radio-ohjelman tekemiseen. Ohjelman käyttöön tutustutaan tarkemmin [[Audacity - Perustoiminnot ja äänen nauhoittaminen]] oppaan avulla.&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Digitaalinen äänitystyöasema]]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Multimedia]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=SyncEvolution&amp;diff=30726</id>
		<title>SyncEvolution</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=SyncEvolution&amp;diff=30726"/>
		<updated>2010-02-15T21:15:21Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: luokkaa ei ole&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ Ohjelma &lt;br /&gt;
| nimi=syncEvolution&lt;br /&gt;
| kuva=&lt;br /&gt;
| kuvateksti= &lt;br /&gt;
| lisenssi=[[GPL]] &lt;br /&gt;
| käyttöliittymä=Komentorivi, [[GTK]]&lt;br /&gt;
| kotisivu=[http://syncevolution.org/ syncevolution.org]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[kuva:Sync.png|right|250px|thumb|Synkkauspalvelu]]&lt;br /&gt;
[[kuva:Sync-palvelut.png|right|250px|thumb|Tuetut palvelut]]&lt;br /&gt;
[[kuva:Sync.uusi-palvelu.png|right|250px|thumb|Määritetään uusi palvelu.]]&lt;br /&gt;
[[kuva:Sync-synkkaus-ovi-com.png|right|250px|thumb|ovi.com synkkaus.]]&lt;br /&gt;
&lt;br /&gt;
syncEvolution synkronoi yhteystietoja, kalentereita, tehtäviä ja muistiota käyttäen [[SyncML]]-standardia.&lt;br /&gt;
SyncEvolution tukee [[Gnome]]n [[Evolution]] ohjelmaa, Nokia 770/800 Internet Tabletia ja Mac OS X iPhonenen (0.7) synkronointia järjestelmän osoitekirjasta. Ohjelma on vielä kehitysasteella.&lt;br /&gt;
&lt;br /&gt;
==Asennus==&lt;br /&gt;
===Ubuntu ja Debian===&lt;br /&gt;
{{Epävirallinen pakettilähde}}&lt;br /&gt;
syncEvolutionin voi asentaa [[Ubuntu]]un ottamalla käyttöön epävirallisen pakettilähteen [http://downloads.syncevolution.org/apt/README.txt pakettilähteen kotisivuilta] löytyvillä ohjeilla ja asentamalla tämän jälkeen paketin &amp;lt;tt&amp;gt;syncevolution-evolution&amp;lt;/tt&amp;gt;. Lisätietoja ohjelmien asentamisesta löytyy artikkelista [[Ohjelmien asentaminen]].&lt;br /&gt;
&lt;br /&gt;
Komentorivityökalu &amp;lt;tt&amp;gt;syncevolution&amp;lt;/tt&amp;gt; suorittaa synkronoinnin. &amp;lt;tt&amp;gt;Sync-ui&amp;lt;/tt&amp;gt; on graafinen GTK käyttöliittymä.&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
* [[Evolution]]&lt;br /&gt;
* [[Opensync]] [http://opensync.org/]&lt;br /&gt;
* [[Gnokii]] [http://gnokii.org/]&lt;br /&gt;
* [[Conduit]] [http://www.conduit-project.org/]&lt;br /&gt;
* [[Multisync]] [http://multisync.org]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
* [http://mobileyog.blogspot.com/2009/11/how-to-sync-contactscalendar-from.html How to Sync Contacts, Calendar from OVI.com to your Evolution in Ubuntu.]&lt;br /&gt;
* [https://help.ubuntu.com/community/NokiaEvolutionSyncing?action=show&amp;amp;redirect=NokiaEvolutionBluetoothSyncing  Ubuntu foorumi - Nokia Evolution Syncing]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Ohjelmat]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Fd&amp;diff=30725</id>
		<title>Fd</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Fd&amp;diff=30725"/>
		<updated>2010-02-15T21:12:08Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: Ak: Ohjaus sivulle Tiedostokuvain&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Tiedostokuvain]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=File_descriptor&amp;diff=30724</id>
		<title>File descriptor</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=File_descriptor&amp;diff=30724"/>
		<updated>2010-02-15T21:11:48Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: Ak: Ohjaus sivulle Tiedostokuvain&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Tiedostokuvain]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Putki&amp;diff=30723</id>
		<title>Putki</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Putki&amp;diff=30723"/>
		<updated>2010-02-15T21:11:05Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: lk.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Putkittaminen&#039;&#039;&#039; tarkoittaa toiseen ohjelman [[standardituloste]]en ohjaamista toisen ohjelman standardisyötteelle. Se on erittäin hyödyllinen [[komentotulkki]]&amp;lt;nowiki&amp;gt;operaatio&amp;lt;/nowiki&amp;gt;, jonka hallitseminen yhdessä [[grep]] ja [[less]] -komentojen kanssa on avain Linux- ja Unix-järjestelmien komentotulkin tehokkaaseen hyödyntämiseen. Komentotulkissa putki luodaan operaattorilla &#039;&#039;ohjelma1&#039;&#039; | &#039;&#039;ohjelma2&#039;&#039;. Merkistä | käytetään tässä yhteydessä tämän vuoksi yleensä nimeä &#039;&#039;putki&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Esimerkki ==&lt;br /&gt;
[[cat]] tulostaa [[argumentti]]na annetun tiedoston omalle standarditulosteelleen. [[Less]] ja [[more]] ovat ohjelmia, jotka normaalitilassa vierittävät standardisyötettä ruudullisen kerrallaan. Kun cat:in tuloste putkitetaan less:ille, on tulostettavaa tiedostoa helpompi lukea:&lt;br /&gt;
 cat tiedosto | less&lt;br /&gt;
&lt;br /&gt;
Putkitettavan tulosteteen ei tarvitse välttämättä olla tekstiä, vaan mitä tahansa dataa voidaan ohjata putkeen. Jos tiedosto &#039;&#039;kuva.png.gz&#039;&#039; on [[gzip]]illä pakattu [[PNG]]-kuvatiedosto, se voidaan katsoa [[ImageMagick]]in &#039;&#039;display&#039;&#039; komennolla X-ikkunassa seuraavasti:&lt;br /&gt;
 gunzip -c kuva.png.gz | display -&lt;br /&gt;
Tässä gzip-jakeluun kuuluva gunzip on purkaa pakatun tiedoston &#039;&#039;kuva.png.gz&#039;&#039;. Gunzipin [[valitsin]] -c ohjaa puretun datavirran (siis alkuperäisen, pakkaamattoman kuvatiedoston) [[standardituloste]]elle. ImageMagickin displayn argumenttina on näytettävän kuva tiedostonimi. Tiedostonimi väliviiva (-) on yleinen tapa kertoa ohjelmalle, että tiedostoa ei lueta [[tiedostojärjestelmä]]stä lainkaan, vaan se annetaan datavirtana ohjelman standardisyötteelle. Lopputuloksena ImageMagick siis lukee gunzip:in purkaman tiedoston ja näyttää sen käyttäjälle.&lt;br /&gt;
&lt;br /&gt;
Putkia voi olla myös useita peräkkäin, ja niitä voi yhdistellä komentotulkin [[uudelleenohjaus]]&amp;lt;nowiki&amp;gt;operaattoreihin&amp;lt;/nowiki&amp;gt; mielivaltaisesti. Seuraava komento poistaa tiedostosta &#039;&#039;kayttajat.txt.gz&#039;&#039; identtiset rivit komennolla [[uniq]], ja lopuksi pakkaa tiedoston uudelleen, sekä ohjaa pakatun tulosteen tiedostoon &#039;&#039;kayttajat-uniq.txt.gz&#039;&#039;&lt;br /&gt;
 gzip -c kayttajat.txt.gz | uniq | gzip -c - &amp;gt; kayttajat-uniq.txt.gz&lt;br /&gt;
&lt;br /&gt;
== Standardivirhe ==&lt;br /&gt;
Putkitusoperaattori | ohjaa vain ohjelman standarditulosteen toiselle ohjelmalle. Minkä tahansa putkessa esiintyvän ohjelman virheilmoitukset tulostuvat siksi suoraan [[terminaali]]in. Koska jokaisella ohjelmalla on vain kaksi ulostuloa (standardituloste ja -virhe) mutta vain yksi sisääntulo (standardisyöte), pitää standardivirhe ohjata erikseen standardi&#039;&#039;&#039;tulosteelle&#039;&#039;&#039;, jotta se voitaisiin putkittaa toiselle ohjelmalle. Tämä tapahtuu komentamalla&lt;br /&gt;
 &#039;&#039;ohjelma1&#039;&#039; 2&amp;gt;&amp;amp;1 | &#039;&#039;ohjelma2&#039;&#039;&lt;br /&gt;
Jos jonkin putkessa olevan ohjelman standardivirhettä ei haluta putkittaa toiselle ohjelmalle, mutta sitä ei myöskään haluta näkyville terminaaliin, se voidaan ohjata erikoistiedostoon [[null|/dev/null]] esimerkiksi seuraavasti:&lt;br /&gt;
 &#039;&#039;ohjelma1&#039;&#039; | &#039;&#039;ohjelma2&#039;&#039; 2&amp;gt; /dev/null | &#039;&#039;ohjelma3&#039;&#039;&lt;br /&gt;
Tämä ohjaa &#039;&#039;ohjelma2&#039;&#039;:n mahdolliset virheilmoitukset null:ille. &#039;&#039;ohjelma1&#039;&#039;:n ja &#039;&#039;ohjelma3&#039;&#039;:n virheilmoitukset tulostuvat normaalisti terminaaliin.&lt;br /&gt;
&lt;br /&gt;
== Katso myös ==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Nimetty putki]]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Tiedostokuvain&amp;diff=30722</id>
		<title>Tiedostokuvain</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Tiedostokuvain&amp;diff=30722"/>
		<updated>2010-02-15T21:10:39Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: ei tämä nyt ihan perustietoa ole&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Tiedostokuvain&#039;&#039;&#039; eli &#039;&#039;&#039;file descriptor&#039;&#039;&#039; on [[ydin|ytimen]] jokaiseen [[prosessi]]n avoimeen tiedostoon liittämä kokonaisluku. Tiedostokuvaimet 0, 1 ja 2 on normaalisti varattu prosessin [[standardivirrat|standardivirroille]] eli standardisyötteelle, -tulosteelle ja -virheelle vastaavasti.&lt;br /&gt;
&lt;br /&gt;
== Katso myös ==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Tiedostokuvain&amp;diff=30721</id>
		<title>Tiedostokuvain</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Tiedostokuvain&amp;diff=30721"/>
		<updated>2010-02-15T21:09:52Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Tiedostokuvain&#039;&#039;&#039; eli &#039;&#039;&#039;file descriptor&#039;&#039;&#039; on [[ydin|ytimen]] jokaiseen [[prosessi]]n avoimeen tiedostoon liittämä kokonaisluku. Tiedostokuvaimet 0, 1 ja 2 on normaalisti varattu prosessin [[standardivirrat|standardivirroille]] eli standardisyötteelle, -tulosteelle ja -virheelle vastaavasti.&lt;br /&gt;
&lt;br /&gt;
== Katso myös ==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Tiedostokuvain&amp;diff=30719</id>
		<title>Tiedostokuvain</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Tiedostokuvain&amp;diff=30719"/>
		<updated>2010-02-15T21:09:23Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: perustietoa&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Tiedostokuvain&#039;&#039;&#039; eli &#039;&#039;&#039;file descriptor&#039;&#039;&#039; on [[ydin|ytimen]] jokaiseen [[prosessi]]n avoimeen tiedostoon liitettämä kokonaisluku. Tiedostokuvaimet 0, 1 ja 2 on normaalisti varattu prosessin [[standardivirrat|standardivirroille]] eli standardisyötteelle, -tulosteelle ja -virheelle vastaavasti.&lt;br /&gt;
&lt;br /&gt;
== Katso myös ==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=EOF&amp;diff=30718</id>
		<title>EOF</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=EOF&amp;diff=30718"/>
		<updated>2010-02-15T21:04:59Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;EOF&#039;&#039;&#039; eli &#039;&#039;&#039;loppumerkki&#039;&#039;&#039; on C-ohjelmoinnissa ja yleisesti Unix-järjestelmissä tiedoston lopusta kertova merkki. Kun ohjelma lukee tiedostosta loppumerkin EOF, se tarkoittaa yleensä, että tiedoston loppu on saavutettu, eikä lisää tietoa ole enää saatavilla.&lt;br /&gt;
&lt;br /&gt;
== C-ohjelmoinnissa ==&lt;br /&gt;
C-ohjelman kannalta tiedostot näkyvät [[tiedostokuvain|tiedostokuvaimina]] (engl. &#039;&#039;file descriptor&#039;&#039;). Tiedostokuvaimesta, joka yleensä on liitetty tiedostoon, mutta voi olla liitetty myös johonkin [[standardivirta]]an tai [[putki|putkeen]], voi lukea tavuja standardikirjaston kutsulla &#039;&#039;fgetc()&#039;&#039;. Kutsu palauttaa normaalisti tiedoston seuraavan 8-bittisen merkin, mutta mikäli tiedosto on lopussa tai lukemisessa tapahtuu virhe, kutsu palauttaa erikoisarvon EOF. EOF ei ole positiivinen 8-bittinen kokonaisluku (s.o. luku väliltä 0-255), vaan negatiivinen &#039;&#039;int&#039;&#039; -arvo. Näin mikään tiedosto ei voi sisältää merkkiä EOF, eikä sitä voi tallettaa tyyppiin &#039;&#039;unsigned char&#039;&#039;. Siksi paluuarvo EOF on aina erikoistapaus.&lt;br /&gt;
&lt;br /&gt;
C-ohjelman tulee aina erikseen varmistaa, merkitseekö EOF -paluuarvo todella tiedoston loppua vai virhetilannetta kutsulla &#039;&#039;feof()&#039;&#039; tai &#039;&#039;ferror()&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Loppumerkki&amp;diff=30717</id>
		<title>Loppumerkki</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Loppumerkki&amp;diff=30717"/>
		<updated>2010-02-15T21:04:14Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: Ak: Ohjaus sivulle EOF&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[EOF]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=EOF&amp;diff=30716</id>
		<title>EOF</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=EOF&amp;diff=30716"/>
		<updated>2010-02-15T21:02:59Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: Ak: Uusi sivu: &amp;#039;&amp;#039;&amp;#039;EOF&amp;#039;&amp;#039;&amp;#039; eli &amp;#039;&amp;#039;&amp;#039;loppumerkki&amp;#039;&amp;#039;&amp;#039; on C-ohjelmoinnissa ja yleisesti Unix-järjestelmissä tiedoston lopusta kertova merkki. Kun ohjelma lukee tiedostosta loppumerkin EOF, se tarkoittaa y…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;EOF&#039;&#039;&#039; eli &#039;&#039;&#039;loppumerkki&#039;&#039;&#039; on C-ohjelmoinnissa ja yleisesti Unix-järjestelmissä tiedoston lopusta kertova merkki. Kun ohjelma lukee tiedostosta loppumerkin EOF, se tarkoittaa yleensä, että tiedoston loppu on saavutettu, eikä lisää tietoa ole enää saatavilla.&lt;br /&gt;
&lt;br /&gt;
== C-ohjelmoinnissa ==&lt;br /&gt;
C-ohjelman kannalta tiedostot näkyvät [[tiedostokuvaimina]] (engl. &#039;&#039;file descriptor&#039;&#039;). Tiedostokuvaimesta, joka yleensä on liitetty tiedostoon, mutta voi olla liitetty myös johonkin [[standardivirta]]an tai [[putki|putkeen]], voi lukea tavuja standardikirjaston kutsulla &#039;&#039;fgetc()&#039;&#039;. Kutsu palauttaa normaalisti tiedoston seuraavan 8-bittisen merkin, mutta mikäli tiedosto on lopussa tai lukemisessa tapahtuu virhe, kutsu palauttaa erikoisarvon EOF. EOF ei ole positiivinen 8-bittinen kokonaisluku (s.o. luku väliltä 0-255), vaan negatiivinen &#039;&#039;int&#039;&#039; -arvo. Näin mikään tiedosto ei voi sisältää merkkiä EOF, eikä sitä voi tallettaa tyyppiin &#039;&#039;unsigned char&#039;&#039;. Siksi paluuarvo EOF on aina erikoistapaus.&lt;br /&gt;
&lt;br /&gt;
C-ohjelman tulee aina erikseen varmistaa, merkitseekö EOF -paluuarvo todella tiedoston loppua vai virhetilannetta kutsulla &#039;&#039;feof()&#039;&#039; tai &#039;&#039;ferror()&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Standardivirta&amp;diff=30715</id>
		<title>Standardivirta</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Standardivirta&amp;diff=30715"/>
		<updated>2010-02-15T21:01:58Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: Ak: Ohjaus sivulle Standardivirrat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Standardivirrat]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Data_sink&amp;diff=30712</id>
		<title>Data sink</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Data_sink&amp;diff=30712"/>
		<updated>2010-02-15T20:48:23Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: Ak: Ohjaus sivulle Null&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Null]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Null&amp;diff=30711</id>
		<title>Null</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Null&amp;diff=30711"/>
		<updated>2010-02-15T20:48:03Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: +data sink&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tt&amp;gt;/dev/null&amp;lt;/tt&amp;gt; on Unix-järjestelmissä (myös Linux) [[Linuxin hakemistorakenne|/dev-hakemistossa]] sijaitseva [[laitetiedosto]], johon kaikilla käyttäjillä on kirjoitusoikeus, mutta johon kirjoitettu data yksinkertaisesti häviää. Mikä tahansa ohjelma voi avata tiedoston. Kaikki luvut siitä palauttavat [[EOF|loppumerkin]]. Tämän vuoksi sen koon voidaan sanoa aina olevan 0 - &amp;lt;tt&amp;gt;/dev/null&amp;lt;/tt&amp;gt; ei siis sisällä mitään. Sen sijaan kaikki &amp;lt;tt&amp;gt;/dev/null&amp;lt;/tt&amp;gt;iin kirjoitettu data ilmoitetaan kirjoittavalle ohjelmalle hyväksytyksi, mutta tietoa ei tallenneta mihinkään.&lt;br /&gt;
&lt;br /&gt;
Null:ia läheisesti muisuttaa [[zero]]. Näitä laitetiedostoja kutsutaan ajottain leikkimielisesti englanniksi nimellä &#039;&#039;data sink&#039;&#039;, eli dataviemäri.&lt;br /&gt;
&lt;br /&gt;
== Esimerkki ==&lt;br /&gt;
Komentotulkissa ohjelman &amp;lt;tt&amp;gt;ohjelma1&amp;lt;/tt&amp;gt; virheilmoituksista ei olla kiinnostuttu, mutta sen normaali tuloste halutaan talteen. Ohjataan [[standardivirhe]] &amp;lt;tt&amp;gt;/dev/null&amp;lt;/tt&amp;gt;-laitetiedostoon ja kiinnostava tuloste talteen oikeaan tiedostoon:&lt;br /&gt;
 ohjelma1 2&amp;gt; /dev/null &amp;gt; talteen.txt&lt;br /&gt;
Lisätietoja syötteen ohjaamisesta löytyy artikkelista [[Komentorivin perusteet]].&lt;br /&gt;
&lt;br /&gt;
== Katso myös ==&lt;br /&gt;
*[[Zero|/dev/zero]]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Linux.fi:Kahvihuone&amp;diff=30707</id>
		<title>Linux.fi:Kahvihuone</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Linux.fi:Kahvihuone&amp;diff=30707"/>
		<updated>2010-02-15T20:44:17Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: +kys.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;HUOM!&#039;&#039;&#039; Lisääthän uudet keskusteluaiheet kahvihuoneen alkuun, niin sivu pysyy selkeämpänä. Hyvän tavan mukaista on myös käyttää &amp;lt;nowiki&amp;gt;--~~~~~&amp;lt;/nowiki&amp;gt; -merkintää viestien lopussa, jotta kirjoittaja ja kirjoitusaika jäisivät selvemmin esille. &lt;br /&gt;
&lt;br /&gt;
Vanhat keskustelut on arkistoitu sivulle [[Arkisto:Kahvihuone]].&lt;br /&gt;
&lt;br /&gt;
== Artikkelien aloittaminen ==&lt;br /&gt;
Tätä on varmaan kysystty jo aiemmin, mutta onko tapana &#039;&#039;&#039;korostaa&#039;&#039;&#039; artikkelin nimen tai avainsanan ensimmäinen esiintymä Wikipedian tapaan? --[[Käyttäjä:Ordyh|Ordyh]] 15. helmikuuta 2010 kello 20.44 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Seedausta kaipaavat jakelut ==&lt;br /&gt;
&lt;br /&gt;
Mitä sanotte tällaisesta ajatuksesta että ylläpidettäisi lista eniten seedausta kaipaavista laillisista linux-torrenteista? --[[Käyttäjä:Cerre|Cerre]] 3. helmikuuta 2010 kello 05.48 (UTC)&lt;br /&gt;
:Tällaisen listan ylläpitäminen wikissä on todella hankalaa ja epäkäytännöllistä. Linux-torrenttisivustoilta löytänee hakutoiminnolla paremmin tällaisia tietoja. --[[Käyttäjä:Heikki|Heikki]] 3. helmikuuta 2010 kello 14.32 (UTC)&lt;br /&gt;
::Entä erillinen sivu jossa on tietoa suosituimpien jakeluiden julkaisuaikataulusta? Minun havaintojen perusteella suosituimpien uusimmat versiot vetää parhaiten.&lt;br /&gt;
::Distrowatchissa on luettelo kymmenestä suosituimmista: Ubuntu, Fedora, OpenSUSE, Debian, Mandriva, Linux Mint, PCLinuxOS, Slackware, Gentoo, CentOS ja erikoismaininta koskien FreeBSD:tä. Lähdetäänkö pitämään ainakin osasta näistä kirjaa julkaisupäivämääristä? --[[Käyttäjä:Cerre|Cerre]] 14. helmikuuta 2010 kello 14.54 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Usean sivun seuraaminen ==&lt;br /&gt;
&lt;br /&gt;
Haluaisin tietää miten voi vaivattomasti pistää useamman kun yhden sivun kerralla seurantaan. Linux.fi on vielä niin pieni wiki etten näe estettä seurata vaikka kaikkia sivuja. Nythän joutuisin laittamaan jokaisen erikseen seurantaan, mikä ei nyt ihan ole kätevää. --[[Käyttäjä:Cerre|Cerre]] 21. tammikuuta 2010 kello 15.26 (UTC)&lt;br /&gt;
:Enpä ole tuota seuranta/tarkkailuhommaa itse kokeillut enkä tiedä mitä sillä tarkkaan ottaen saavutetaan, mutta itse olen suosinut [[Toiminnot:Tuoreet muutokset|Tuoreet muutokset -sivua]] wikin muokkausten tarkkailuun, ja olen ollut ihan tyytyväinen. --[[Käyttäjä:Maakuth|Maakuth]] 21. tammikuuta 2010 kello 16.52 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Clonezilla, Partimage ja muut Linuxin päälle rakennetut työkalut ==&lt;br /&gt;
&lt;br /&gt;
Onko teidän mielestä aiheellista vääntää asiaa otsikossa mainituista, no, minijakeluista? Kysehän ei ole varsinaisista käyttöjärjestelmistä, mutta Linuxiin ne kuitenkin perustuu ja on aivan erinomaisen käyttökelpoisia. --[[Käyttäjä:Cerre|Cerre]] 7. tammikuuta 2010 kello 18.48&lt;br /&gt;
:Ilman muuta voi kirjoittaa, mikäpäs niissä. Jos niistä on Linux-käyttäjille hyötyä niin voi mielestäni kirjoittaa vaikkei suoranaisesti edes perustuisi Linuxiin. --[[Käyttäjä:Maakuth|Maakuth]] 7. tammikuuta 2010 kello 22.41 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Linuxkouluun.fi -artikkelien siirto Linux.fi -wikiin==&lt;br /&gt;
&lt;br /&gt;
Linuxkouluun.fi sivustojen artikkeleita voi siirtää nyt kuka tahansa asiasta kiinnostunut. Ohjeita aiheesta löytyy sivulta [[Linux.fi:Linuxkouluun.fi]]. Keskustelua aiheesta voi käytä esim. kyseisen sivun keskustelupalstalla. --[[Käyttäjä:OpinsysASokero|OpinsysASokero]] 22. syyskuuta 2009 kello 08.02 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Kiitos Pb:lle ==&lt;br /&gt;
Tehdä rysäytin sivun [[Puppy Linux 4.2:n asentaminen USB-muistille]], ja [[Käyttäjä:Pb|Pb]] ystävällisesti korjaili lähettämieni kuvakaappausten metatietoja. Seuraavalla kerralla osaan itse :) --[[Käyttäjä:Akaihola|Akaihola]] 22. toukokuuta 2009 kello 21.18 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Päivitys ==&lt;br /&gt;
Päivitin Mediawikin versioon 1.14.0, jos jotain on mennyt rikki niin ilmoitelkaapa. Lisäsin samalla PDF-tiedostot sallittujen tiedostomuotojen joukkoon, eli tarvittaessa wikiin voi nyt lisätä myös PDF-muodossa olevaa (vapaata) materiaalia jos sellaiselle on tarvetta (esim. esityksiä). --[[Käyttäjä:Heikki|Heikki]] 23. helmikuuta 2009 kello 16.34 (UTC)&lt;br /&gt;
:Päivitin versioon 1.15.0. Ilmoitelkaapa mahdollisista ongelmista. --[[Käyttäjä:Heikki|Heikki]] 5. heinäkuuta 2009 kello 15.01 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Uusi etusivu ==&lt;br /&gt;
[[Etusivu2]] tehtiin lopultakin loppuun ja kopioitiin varsinaiseksi etusivuksi. Nyt etusivu on huomattavasti yksinkertaisempi ja ulkoasultaan miellyttävämpi. Nyt olisikin hyvä miettiä materiaalin saavutettavuutta esim. [[:Luokka:Portaalit|portaalien]] välityksellä, joille etusivulta nyt pääasiassa linkitetään. Kommentit ja parannusehdotukset uudesta etusivusta ovat tervetulleita, ja muistattehan että vaikka etusivu onkin suojattu muutoksilta, kaikkea sisältöä voi muokata muokkaamalla sopivia mallineita (löytyvät kun katsoo etusivun lähdekoodia). Isompia muutoksia kannattaa ensin suunnitella muokkaamalla sivua [[Etusivu2]]. --[[Käyttäjä:Heikki|Heikki]] 3. joulukuuta 2008 kello 13.07 (UTC)&lt;br /&gt;
:Mielestäni etusivulta katosi vähän liikaa sisältöä... Portaalilinkkien &amp;quot;hierarkiataso&amp;quot; ei myöskään ole aivan looginen, esimerkiksi kuvankatselu- ja käsittelyohjelmiin löytyy linkki, mutta toisaalta ei ohjelmat-luokkaan. Etusivun tarkoituksenahan on, että lukija pääsee sitä kautta &amp;quot;sisälle&amp;quot; sivustoon. Jos etusivulla on kovin vähän ja hajanaisia linkkejä, ei tämä toteudu kovin hyvin.&lt;br /&gt;
&lt;br /&gt;
:Portaalisivut ovat käteviä, mikäli aiheesta ei löydy sopivaa yleisartikkelia ja jos aiheeseen liittyvä luokka on sekava. Kannattaisi näin ollen miettiä, minkä aiheiden suhteen erillinen portaalisivu todella tarjoaa lisäarvoa, ja missä se taas vain monimutkaistaa navigointia. &lt;br /&gt;
&lt;br /&gt;
:Komentorivi-, järjestelmä- ja verkkoluokat kiistatta kaipaavat selittävää linkkikokoelmaa (=portaalia) helpottamaan asioiden löytämistä. Toisaalta esimerkiksi www-selaimista tai ohjelmat-luokasta ei sellaista kannata laatia, koska käytössä on jo hyvä yleisartikkeli ja selkeä luokka. Kannattaisi ehkä myös miettiä, minkä artikkelien kohdalla selkeys vaatii Portaali-etuliitteen ja minkä ei. [[Osiointityökalut]]-artikkelia ei ainakaan kannattane siirtää sille Portaali-nimelle, Komentorivi-artikkeli on siinä rajalla (etuliitteen puuttuminen tekisi siihen linkittämisen siistimmäksi).&lt;br /&gt;
&lt;br /&gt;
:Paras vaihtoehto Aihealueet-mallineeksi voisi olla nykyisen ja vanhan mallin sekoitus, jossa olisi runsaahkosti tietoa, mutta entistä selkemmin. Yhteistyö-ruudun voisi mielestäni poistaa, sillä se ei erityisemmin tunnu houkuttelevan uusia muokkaajia. --[[Käyttäjä:Pb|Pb]] 4. joulukuuta 2008 kello 22.15 (UTC)&lt;br /&gt;
::Tuohonhan sopisi vielä kolmas sarake, ehkä siihen voisi laittaa linkkejä sellaisiin paikkoihin jotka nykyisellään jäävät kattamatta. Tuo kuvakkeiden käyttäminen vähentää etusivun kolkkoutta aika strategisesti, haluaisin säilyttää sen. Yhteistyöartikkeli taitaa tosiaan olla hieman kuolleena syntynyt ajatus. --[[Käyttäjä:Maakuth|maakuth]] 4. joulukuuta 2008 kello 22.31 (UTC)&lt;br /&gt;
:::Kolmas sarake (pystyrivi) aiheuttaa toisaalta ongelmia pienemmillä resoluutioilla. Esimerkiksi 1024x768:lla (Konqueror) näyttö on jo nykyisellään melko täynnä. Kuvat ovat tosiaan kannatettavia, kunhan niitä ei ole liikaa (jolloin sivu muodostuu &amp;quot;sarjakuvanomaiseksi&amp;quot;). --[[Käyttäjä:Pb|Pb]] 4. joulukuuta 2008 kello 23.25 (UTC)&lt;br /&gt;
&lt;br /&gt;
Olisiko jollakulla esittää parannusehdotuksia nykyisen [[Etusivu2]]:n suhteen? Omasta mielestäni se on jossain määrin &amp;quot;sotkuinen&amp;quot; (runsaasti tekstimassaa) verrattuna nykyiseen etusivuun, mutta toisaalta huomattavasti informatiivisempi. --[[Käyttäjä:Pb|Pb]] 25. maaliskuuta 2009 kello 21.38 (UTC)&lt;br /&gt;
:Onhan tuo tosiaan informatiivisempi. Ehkä tekstimassaa on aika paljon, mutta toisaalta tärkeintä toki on että etsimänsä asian löytää helposti. Mitä muutamalta satunnaiselta käyttäjältä kyselin niin Etusivu2 ainakin voittaa nykyisen etusivun. Eli kaipa tähän voidaan siirtyä. --[[Käyttäjä:Heikki|Heikki]] 30. maaliskuuta 2009 kello 04.07 (UTC)&lt;br /&gt;
::Vaihdettu. --[[Käyttäjä:Pb|Pb]] 30. maaliskuuta 2009 kello 13.11 (UTC)&lt;br /&gt;
&lt;br /&gt;
==Toiminnot:Luokat==&lt;br /&gt;
Etusivullekin linkitetty [[Toiminnot:Luokat]] vaikuttaisi listaavan vain osan wikin luokista, tarkemmin sanottuna puolet niistä... --[[Käyttäjä:Pb|Pb]] 6. marraskuuta 2008 kello 19.15 (UTC)&lt;br /&gt;
:Eikös tuon kuulukin näyttää ainoastaan juuritason luokat? Vai puuttuuko tuosta niitäkin? --[[Käyttäjä:Maakuth|maakuth]] 7. marraskuuta 2008 kello 12.21 (UTC)&lt;br /&gt;
::Puuttuu, tuossa on sekaisin kumpiakin. --[[Käyttäjä:Pb|Pb]] 7. marraskuuta 2008 kello 20.46 (UTC)&lt;br /&gt;
Tuntuisi taas toimivan (MediaWiki 1.14.0). --[[Käyttäjä:Pb|Pb]] 25. maaliskuuta 2009 kello 21.33 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Vapaata materiaalia jota voi hyödyntää ==&lt;br /&gt;
Ainakin seuraavista lähteistä löytyy materiaalia, josta laadukkainta osaa voi hyödyntää Linux.fissä joskus jopa suoraan. Eli jos jollain on ylimääräistä aikaa niin hyvä homma käydä läpi:&lt;br /&gt;
*[http://forum.ubuntu-fi.org/index.php?board=23.0 Ubuntu Suomen keskustelualueen Wikiin siirrettävät oppaat]: Ubuntu Suomen foorumeilla on monta foorumille kirjoitettua opasta, joihin on kysytty lupa siirtää Linux.fihin CC-BY:n alaiseksi. Täältä olen viime aikoina siirtänyt esim. artikkelin [[Ohjelmistopohjainen RAID ja LVM]]&lt;br /&gt;
*[http://unix.se/Huvudsida unix.se]-wiki. Kaikki materiaali CC-BY:n alaista (mainittava siis lähde unix.se). Täältä olen siirtänyt artikkelin [[Ed]]. Wiki siis ruotsiksi, mutta Google osaa kääntää hyvin englanniksi jos toinen kotimainen ei taivu.&lt;br /&gt;
Jos jollain on tiedossa muita vastaavia paikkoja, saa mainita tässä. --[[Käyttäjä:Heikki|Heikki]] 17. syyskuuta 2008 kello 17.28 (UTC)&lt;br /&gt;
&lt;br /&gt;
: CC-BY (ja tekijänoikeuslaki muutenkin) edellyttää, että &#039;&#039;tekijä&#039;&#039; mainitaan. Julkaisijan tai lähteen manitseminen ei korvaa sitä, ellei tällaisesta ole erikseen sovittu. Wikien kohdalla tekijät ilmenevät muokkaushistoriasta, mikä saattaa riittää, mutta materiaalia lainattaessa pitää huolehtia siitä, että linkki muokkaushistoriaan säilyy (siis jää linux.fi:n muokkaushistorian osaksi). Suosittelisin linkin wiki-sivun senhetkisen versioon (työkalulistan &amp;quot;ikilinkki&amp;quot;). --[[Käyttäjä:LP|LP]] 8. marraskuuta 2008 kello 14.14 (UTC)&lt;br /&gt;
::Esimerkiksi tämän wikin [[Linux.fi:Lisenssi|lisenssisivulla]] mainitaan että Linux.fi:n mainitseminen riittää, tuosta tietysti jokainen lähde erikseen. Unix.se:n [http://unix.se/UnixSE:Copyright lisenssisivulla] tuota ei taideta mainita, joku paremmin toista kotimaista hallitseva tarkentakoon. Totta sinänsä mitä sanoit kyllä. --[[Käyttäjä:Maakuth|maakuth]] 8. marraskuuta 2008 kello 15.15 (UTC)&lt;br /&gt;
:::Tuolla Unix.se:n sivulla ei tosiaan ole mainittu, että BY-vaatimuksen voisi täyttää pelkällä &amp;quot;unix.se&amp;quot;-maininnalla. Materiaalia käyttäville sivuille täytyy siis listata koko tekijähistoria. Uudempien versioiden ongelmaa ei toisaalta ole, sillä unix.se-wiki on käytännössä kuollut useita vuosia takaperin, eikä sinne tämän vuoden aikana ole edes voinut kirjautua! Wiki oli hiljattain myös muutaman viikon poissa linjoilta, kun omistaja ilmeisesti unohti uusia domainin. Pelkkä linkki artikkelin historiaan on toisin sanoen kovin epävarma tapa täyttää by-vaatimus. Vaikka todennäköisyys sille, että joku tekijöistä löytäisi tänne ja jotenkin välittäisi asiasta on kyllä korkeintaan yksi miljardista. ;) --[[Käyttäjä:Pb|Pb]] 8. marraskuuta 2008 kello 23.34 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Uudistuksia ==&lt;br /&gt;
Wikin [[Linux.fi:TODO|TODO]]-lista tyhjeni lähes kokonaan ja useita uusia [[Toiminnot:Versio|lisäosia]] asennettiin. Keskustelua enemmän [http://linux.fi/foorumi/index.php?topic=321 keskustelualueella]. --[[Käyttäjä:Heikki|Heikki]] 30. elokuuta 2008 kello 13.46 (UTC)&lt;br /&gt;
:Nyt on sitten myös lyhyet url-osoitteet muotoa linux.fi/wiki/Artikkeli käytössä! --[[Käyttäjä:Heikki|Heikki]] 31. elokuuta 2008 kello 13.35 (UTC)&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;nowiki&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;/nowiki&amp;gt;-nappi==&lt;br /&gt;
Komentoriviohjelmista kirjoittaessa tarvitsee usein &amp;lt;nowiki&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;/nowiki&amp;gt;-tageja, joten lisäsin niitä lisäilevän napin tuohon työkaluriviin. Nappien lisäys näkyy käyvän [[Järjestelmäviesti:Common.js]]:n kautta, joskin tuo lienee vain ylläpitäjien muutettavissa. Mutta jos muita vastaavia nappuloita tarvitaan, niin ylläpitohan niitä voi lisätä jos tarpeelliseksi näkee. --[[Käyttäjä:Maakuth|Maakuth]] 28. elokuuta 2008 kello 23.40 (EEST)&lt;br /&gt;
:Asensin myös syntaksin värikorostus -lisäosan ja tein sille napin josta tulee oletusarvoisesti [[bash]]in tagit. Saadaan skriptit kauniiksi &amp;lt;3 --[[Käyttäjä:Maakuth|Maakuth]] 31. elokuuta 2008 kello 08.16 (UTC)&lt;br /&gt;
&lt;br /&gt;
== RSS-laajennos? ==&lt;br /&gt;
Keskustelualueella oli jossain vaiheessa puhetta lisätä wikin etusivulle ruutu, jossa olisi syöte foorumin uusimmista viesteistä. Tämä vaatisi foorumin [http://linux.fi/foorumi/index.php?type=rss;action=.xml RSS-syötteen] linkittämisen Mediawikin [http://www.mediawiki.org/wiki/Extension:RSS RSS-laajennokseen]. Laajennus pitäisi sitä ennen kuitenkin saada asennettua (=lisätöitä Tepolle). Mitä mieltä olette, kannattaisiko tätä kehitellä eteenpäin? TODO-lista on jo nykyisellään melko pitkä. --[[Käyttäjä:Pb|Pb]] 20. elokuuta 2008 kello 23.32 (EEST)&lt;br /&gt;
:RSS-liitännäisellä saataisiin keskustelualue paremmin esille, joten sanoisin, että senkin voi [[Linux.fi:TODO|TODO-listalle]] laittaa. Yksittäisen lisäosan asentaminen ei ole mikään kovin iso operaatio joten parempi asentaa kerralla useampi kuin lisätä TODO-listalle sitten myöhemmin. --[[Käyttäjä:Heikki|Heikki]] 26. elokuuta 2008 kello 19.30 (EEST)&lt;br /&gt;
&lt;br /&gt;
== Taas yksi heikosti tehty ohje lisää ==&lt;br /&gt;
--[[Käyttäjä:Peran|Peran]] 17. elokuuta 2008 kello 03.36 (EEST)&lt;br /&gt;
http://linux.fi/index.php/TulostusCDlevynPinnalle&lt;br /&gt;
Tuli tehdyksi tälläinen oksennus wikiin. En osaa kovinkaan hyvin käyttää tätä MediaWiki-ohjelmistoa. Josko joku ystävällinen sielu parantelisi ulkoasua ja luokittelisi ko. sivun. Mulla ei myöskään ole hahmotusta Linux.fi:n luokittelusta, mutta yleinen Linux-ohje tämä kuitenkin on, ja perustuu Ubuntu-foorumin ohjeeseen: http://forum.ubuntu-fi.org/index.php?topic=4790&lt;br /&gt;
:Juu, luokitellaan ja parannellaan. Kiitoksia osallistumisesta! --[[Käyttäjä:Maakuth|Maakuth]] 17. elokuuta 2008 kello 12.27 (EEST)&lt;br /&gt;
&lt;br /&gt;
==Muutosten tarkastaminen==&lt;br /&gt;
Otetaanko ylläpidossa käyttöön tuo muutosten tarkastaminen? Eli kun vilkaisee jotain rekisteröimättömän käyttäjän tekemää muutosta, pitäisi painaa &amp;quot;merkitse tarkastetuksi&amp;quot; -linkkiä, niin huutomerkit häviäivät muutosten listalta. Tällä saataisiin pienten muutosten seuraaminen helpommaksi kun ei kaikkien tarvitsisi vilkaista. --[[Käyttäjä:Maakuth|Maakuth]] 28. kesäkuuta 2008 kello 14.20 (EEST)&lt;br /&gt;
:Eipä tuon ominaisuuden hyötykäytöstä mitään haittaakaan ole, eli aletaan vaan klikkailemaan tuota linkkiä. --[[Käyttäjä:Heikki|Heikki]] 28. kesäkuuta 2008 kello 22.35 (EEST)&lt;br /&gt;
::Kyllähän tuo sopii. Itse käyn tosin joka tapauksessa kaikki muutokset läpi. --[[Käyttäjä:Pb|Pb]] 29. kesäkuuta 2008 kello 13.41 (EEST)&lt;br /&gt;
:::Näinhän sitä tietysti monesti tulee tehtyä, mutta tuolla konstilla ei ainakaan lipsahda mitään läpi seulasta. --[[Käyttäjä:Maakuth|Maakuth]] 29. kesäkuuta 2008 kello 15.23 (EEST)&lt;br /&gt;
::Mitenkähän noiden spämmiviestien kanssa... Pitäisikö ne merkitä tarkastetuksi siinä tapauksessa että jäljet on siivottu? --[[Käyttäjä:Maakuth|Maakuth]] 14. elokuuta 2008 kello 00.42 (EEST)&lt;br /&gt;
:::Ylläpidon palauta-napillahan nuo muuttuvat automaattisesti tarkastetuiksi (samalla kun se kumoaa saman käyttäjän kaikki peräkkäiset muokkaukset eikä vaadi erillistä muutosten tallentamista). -- Jos samaan artikkeliin tulee vandalismia monesta eri IP:stä peräkkäin, pitää tietysti painaa tarkastusnappia käsin. Toisaalta tällöin on kyllä aika selvää, että muokkaukset joka tapauksessa huomataan ja kumotaan. Eli vastaus voisi kai olla &amp;quot;jos jaksaa&amp;quot; tai &amp;quot;jos ei pidä punaisista huutomerkeistä tuoreissa muutoksissa&amp;quot;. --[[Käyttäjä:Pb|Pb]] 14. elokuuta 2008 kello 01.44 (EEST)&lt;br /&gt;
&lt;br /&gt;
==  Ohje rikkinäisen kovalevyn/tiedostojärjestelmän korjaamisesta ==&lt;br /&gt;
Ajattelin kirjoitella otsikon mukaista ohjetta (taustatarinaa, kts http://forum.ubuntu-fi.org/index.php?topic=7522.0) - Minkäslaisella otsikolla tämmöinen pitäisikannattaisi tehdä ja miten lisään sen sopiviin luokkiin? --[[Käyttäjä:Rhk|Rhk]] 24. toukokuuta 2008 kello 11.50 (EEST)&lt;br /&gt;
:Itselläni mielessä pyörivät &amp;quot;rikkinäiset tallennusvälineet&amp;quot; tai &amp;quot;tietojen pelastaminen&amp;quot;, mutta laita nyt omasta mielestäsi paras. Luokitukset saat tehtyä laittamalla sivun loppuun luokkamerkinnät tyyliin &amp;lt;nowiki&amp;gt;[[Luokka:Järjestelmä]]&amp;lt;/nowiki&amp;gt;. Katso muista sivuista mallia. --[[Käyttäjä:Maakuth|Maakuth]] 24. toukokuuta 2008 kello 13.17 (EEST)&lt;br /&gt;
&lt;br /&gt;
==Foorumin/wikin yhdistämisestä==&lt;br /&gt;
&lt;br /&gt;
Olen tuunannut Omenamehu.org -keskustelupalstalle (käyttää SMF:ää) yhteisen autentikoinnin Mediawikin ja SMF:n välille. Jos tuon toteutus kiinnostaa, yhteyttä voi ottaa osoitteella mehumaija miukumauku omenamehu.org.&lt;br /&gt;
&lt;br /&gt;
Terveisin,&lt;br /&gt;
&lt;br /&gt;
Sami Lempinen&lt;br /&gt;
&lt;br /&gt;
5. toukokuuta 2008 kello 20.33 (EEST)&lt;br /&gt;
&lt;br /&gt;
==Oma musta lista?==&lt;br /&gt;
Spämmibottien muokkauksia alkaa taas tulla melko rasittavan usein. Oletuksena käytettävä Metan [http://meta.wikimedia.org/wiki/Spam_blacklist musta lista] ei ilmeisestikään päivity tarpeeksi nopeaan tai on liian konservatiivinen. SpamBlacklist-laajennos [http://www.mediawiki.org/wiki/Extension:SpamBlacklist#Custom_blacklist_sources sallisi] kuitenkin päälistan ohella myös paikalliset mustat listat. Voisiko olla ideaa tehdä oma - ylläpitäjien muokattavissa oleva - musta lista? Uusien regexpien lisääminen onnistuisi tällöin ilman viivytyksiä. Omaa listaa voisi käyttää myös yleisempien ilmausten kuten &amp;quot;ring_tones&amp;quot; blokkaamiseen.  --[[Käyttäjä:Pb|Pb]] 4. toukokuuta 2008 kello 16.33 (EEST)&lt;br /&gt;
:Hyvä idea. Varsinkin kun meillä on kielenä suomi niin englanninkielinen avainsanalista voisi olla varsin tehokas torjuntakeino. Etsi/laadi joku tarkka tekninen toteutusohje niin voit laittaa sen [[Linux.fi:TODO|TODO-sivulle]] Tepon huomiota odottamaan. --[[Käyttäjä:Maakuth|Maakuth]] 21. toukokuuta 2008 kello 18.38 (EEST)&lt;br /&gt;
::Tutkin asiaa ja huomasin, että jo nyt ylläpitäjät voivat lisätä domaineja, joihin linkittäminen on estetty, sivulle [[Mediawiki:Spam-blacklist]]. --[[Käyttäjä:Heikki|Heikki]] 24. toukokuuta 2008 kello 13.07 (EEST)&lt;br /&gt;
:::Ei tunnu toimivan... Tuo sivu sekä &amp;lt;tt&amp;gt;Mediawiki:Spam-whitelist&amp;lt;/tt&amp;gt; puuttuvat [[Toiminnot:Järjestelmäviestit|järjestelmäviestien listasta]], mistä ne löytyvät monissa muissa wikeissä. Vaikuttaisi siltä, että tämän wikin SpamBlacklist-laajennos on jokin vanhempi versio, joka ei vielä tue tuota toimintoa. Pitäisi varmaan pyytää Teppoa päivittämään, ja samalla asentamaan muutama muukin laajennos, joita tänne on kaivattu. --[[Käyttäjä:Pb|Pb]] 24. toukokuuta 2008 kello 21.27 (EEST)&lt;br /&gt;
::::TODO-sivun sisältö on vinkattu Tepolle, odotellaan päivityksiä... --[[Käyttäjä:Heikki|Heikki]] 24. toukokuuta 2008 kello 23.39 (EEST)&lt;br /&gt;
&lt;br /&gt;
==Uutisten julkaiseminen==&lt;br /&gt;
Ajoittain on ehdoteltu, että tällä sivustolla alettaisiin julkaista Linux-aiheisia uutisia Suomesta ja maailmalta jossain määrin säännöllisesti. Itsekin olen ruvennut pitämään sitä ihan hyvänä ajatuksena, mutta hommaan tarvittaisiin muutamia jossain määrin sitoutuneita vapaaehtoisia, jotta touhu ei tyssäisi aivan heti. Muutenkin on vaara tarjolla että hankkeesta muodostuu &amp;quot;uutissivusto&amp;quot; jolla uutisia julkaistaan kerran kuussa tai harvemmin. Mitäpä mieltä olisitte moisesta? --[[Käyttäjä:Maakuth|Maakuth]] 3. toukokuuta 2008 kello 18.09 (EEST)&lt;br /&gt;
:Jos vapaaehtoisia todella löytyy, niin eiköhän se onnistu. Etusivulle pitäisi sitten lisätä jonkinlainen &amp;quot;uutisruutu&amp;quot;, josta olisi linkit varsinaisiin uutisartikkeleihin/uutissivulle. Näitä uutissivustoja tosin löytyy Suomesta jo ainakin kaksi kappaletta, etusivullekin linkitetty [http://tonnikala.net/ Tonnikala] sekä [http://linuxonly.info/ LinuxOnly], molemmat tällaisia kerran kuussa -sivustoja. Jos joku on valmis pidempiaikaiseen uutisten kirjoitteluun, niin miksei saman tien &amp;quot;herättäisi henkiin&amp;quot; jompaa kumpaa näistä sivustoista? --[[Käyttäjä:Pb|Pb]] 4. toukokuuta 2008 kello 13.57 (EEST)&lt;br /&gt;
&lt;br /&gt;
== TODO-lista ==&lt;br /&gt;
Eri puolilla tulee aina välillä esiin parannusehdotuksia, jotka vaativat muutoksia palvelinpuolelle. Keräsin näitä erilliselle [[Linux.fi:TODO|sivulle]], josta ne voidaan sitten sopivassa välissä vinkata Tepolle toteuttamista varten. --[[Käyttäjä:Heikki|Heikki]] 26. huhtikuuta 2008 kello 23.11 (EEST)&lt;br /&gt;
&lt;br /&gt;
== Wiki 3v ==&lt;br /&gt;
Kolmevuotissynttärit olivat viime viikolla. Kiitokset kaikille muokkaajille, jatketaan samaan malliin. [http://linux.fi/foorumi/index.php?topic=201.0 Juttua keskustelualueella]. --[[Käyttäjä:Heikki|Heikki]] 26. huhtikuuta 2008 kello 22.28 (EEST)&lt;br /&gt;
&lt;br /&gt;
==Muokkaa-linkin korostus?==&lt;br /&gt;
Ruotsin- ja englanninkielisissä Wikipedioissa sivun ylälaidan muokkaa-linkki on korostettu boldilla. Voisiko tuo kenties sopia tähänkin wikiin? Se auttaisi ainakin korostamaan, että &#039;&#039;kuka tahansa&#039;&#039; voi muokata artikkeleita, ja siten kenties toisi uusia muokkaajia. --[[Käyttäjä:Pb|Pb]] 25. huhtikuuta 2008 kello 19.35 (EEST)&lt;br /&gt;
:Hyvä ajatus. Kaipa tuo jollain css-muutoksella käy varsin kivuttomasti. --[[Käyttäjä:Maakuth|Maakuth]] 25. huhtikuuta 2008 kello 19.40 (EEST)&lt;br /&gt;
::Laitetaanpa kokeeksi... --[[Käyttäjä:Pb|Pb]] 25. huhtikuuta 2008 kello 20.10 (EEST)&lt;br /&gt;
&lt;br /&gt;
==80.223.125.28:n muokkaukset==&lt;br /&gt;
Mitä mieltä olette näistä 80.223.125.28:n [[Toiminnot:Muokkaukset/80.223.125.28|muokkauksista]]? Omasta mielestäni [[:Luokka:Jakelut|Jakelut]]-luokan jakaminen aliluokkiin äitijakeluiden perusteella lähinnä sotkee pakkaa. Jakeluryhmittäisten &amp;quot;kokoomamallineiden&amp;quot; laittaminen voisi kaiketi olla ihan hyväkin idea (vaikka onkin osittain päällekkäinen Katso myös -otsikon ja [[:Malline:Jakelu|Jakelu]]-mallineen kanssa), mikäli sen toteuttaa hivenen harkitummin ja teknisesti oikein. --[[Käyttäjä:Pb|Pb]] 5. maaliskuuta 2008 kello 16.09 (EET)&lt;br /&gt;
:En lähtisi jakamaan jakelut-luokkaa alaluokkiin, mutta jakeluartikkelien katso myös -osiota voisi osittain korvata sukulaisjakeluita listaavalla mallineella. --[[Käyttäjä:Heikki|Heikki]] 5. maaliskuuta 2008 kello 17.48 (EET)&lt;br /&gt;
&lt;br /&gt;
===Luokittelusta===&lt;br /&gt;
::[[Linux.fi:Luokitusremontti]] - Asiasta kannattanee keskustella myös luokituksen kohdalla. [[Käyttäjä:80.223.125.28|80.223.125.28]] 8. maaliskuuta 2008 kello 12.42 (EET)&lt;br /&gt;
&lt;br /&gt;
== Lisäosia ja parannusehdotus mallineeseen [[Malline:Perustietoa|perustietoa]] ==&lt;br /&gt;
&lt;br /&gt;
Tuli näin heti tähän wikiin tutustuessani esille pari ongelmakohtaa. Esimerkiksi lähteiden helppoon merkitsemiseen käytettävää &#039;&#039;[http://www.mediawiki.org/wiki/Extension:Cite Cite]&#039;&#039;-lisäosaa ei ole, eikä kyllä mitään muitakaan käyttömukavuutta parantavia lisäosia löydy.&lt;br /&gt;
&lt;br /&gt;
Koska [[Malline:Perustietoa|perustietoa-malline]] oli suojattu vain ylläpitäjien ja byrokraattien muokattavaksi, tuli mieleeni eräs &#039;&#039;ParserFunctions&#039;&#039;-lisäosan vaativa parannusehdotus &amp;lt;small&amp;gt;([http://meta.wikimedia.org/wiki/ParserFunctions#Installation asennusohje Metassa])&amp;lt;/small&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;[[Malline:Perustietoa]]&#039;&#039;:&amp;lt;br /&amp;gt;&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0; margin-top:10px; border:1px solid #aaa; padding: 0.2em 1em 0.2em 1em; background-color:#F8F8FF; align:right; font-size:1em&amp;quot;&amp;gt;&lt;br /&gt;
Tämä otsikko on perustietoa, jolle parempi paikka on {{#if: {{{1|}}} | [[wikipedia:fi:{{{1}}}|Wikipedia]] | [http://fi.wikipedia.org/ Wikipedia]}}. Tässä wikissä se sisältää pääasiallisesti Linux-erikoistietoa.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;{{Perustietoa}}&amp;lt;/nowiki&amp;gt;:&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0; margin-top:10px; border:1px solid #aaa; padding: 0.2em 1em 0.2em 1em; background-color:#F8F8FF; align:right; font-size:1em&amp;quot;&amp;gt;&lt;br /&gt;
Tämä otsikko on perustietoa, jolle parempi paikka on [http://fi.wikipedia.org/ Wikipedia]. Tässä wikissä se sisältää pääasiallisesti Linux-erikoistietoa.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;{{Perustietoa|Hiiri (osoitinlaite)}}&amp;lt;/nowiki&amp;gt;:&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0; margin-top:10px; border:1px solid #aaa; padding: 0.2em 1em 0.2em 1em; background-color:#F8F8FF; align:right; font-size:1em&amp;quot;&amp;gt;&lt;br /&gt;
Tämä otsikko on perustietoa, jolle parempi paikka on [[wikipedia:fi:Hiiri (osoitinlaite)|Wikipedia]]. Tässä wikissä se sisältää pääasiallisesti Linux-erikoistietoa.&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Olisivatko nämä vain haaveita vai jopa mahdollisia ottaa käyttöön? — [[Käyttäjä:Str4nd|Str4nd]] 22. lokakuuta 2007 kello 19.11 (EEST)&lt;br /&gt;
:Uusista lisäosista täytyy neuvotella [[Käyttäjä:Teppo|Tepon]] kanssa, joka on Linux.fi:n laitteistoylläpitäjä. Etukäteen täytyy tietysti keskustella, mille kaikelle on tarvetta eli mitä me osaamme/jaksamme/viitsimme hyödyntää. --[[Käyttäjä:Pb|Pb]] 22. lokakuuta 2007 kello 20.02 (EEST)&lt;br /&gt;
:: Kyllä, olisi hyvä saada tähän samaan keskusteluun muitakin tarvittavia lisäosia ja keskustelua niiden tarpeellisuudesta (esim. äänestys), ettei tarvitsisi säätää asetuksia useita kertoja. --[[Käyttäjä:Str4nd|str4nd]] &amp;lt;small style=&amp;quot;color:grey&amp;quot;&amp;gt;([[Keskustelu käyttäjästä:Str4nd|jutskaa]])&amp;lt;/small&amp;gt; 23. lokakuuta 2007 kello 12.11 (EEST)&lt;br /&gt;
&lt;br /&gt;
:::Ainakin tuo &#039;&#039;ParserFunctions&#039;&#039;-lisäosa vaikuttaa kätevältä. Lähdemerkinnöille ei monissa artikkeleissa ole tarvetta, mutta tuskin ne mahdollistavasta liitännäisestä haittaakaan olisi. En tunne juurikaan Mediawikin liitännäisiä, joten en oikein tiedä, mitä siellä oikein on tarjolla. Muita ehdotuksia? Asennus ei ainakaan näytä pahalta, tosin voi olla, että ainakin toistaiseksi käytössä oleva php4 ja vanhahko mediawiki tuottavat ongelmia. --[[Käyttäjä:Heikki|Heikki]] 23. lokakuuta 2007 kello 19.26 (EEST)&lt;br /&gt;
::::MediaWikin lisäosat löytyvät [http://www.mediawiki.org/wiki/Category:Extensions MediaWikin sivuilta], Wikipedian lisäosat löytyvät Wikipedian [[wikipedia:fi:Toiminnot:Versio|Toiminnot:Versiosta]], kuitenkin suurin osa Wikipediaan asennetuista lisäosista on hyödyttömiä tänne asennettuna. --[[Käyttäjä:Str4nd|str4nd]] &amp;lt;small style=&amp;quot;color:grey&amp;quot;&amp;gt;([[Keskustelu käyttäjästä:Str4nd|jutskaa]])&amp;lt;/small&amp;gt; 24. lokakuuta 2007 kello 12.14 (EEST)&lt;br /&gt;
&lt;br /&gt;
:::::Muutamia lisäosia joita voisi harkita, pistin joskus irkkiin, mutta laitan vielä tänne muistiin: &#039;&#039;newuserlog, renameuser, user merge and delete, gadgets, configure, mibbit (selain-irc), apc (vaatii 1.13, eikä täällä vissiin ole edes apc:tä), categorytree, cleanchanges, dismissable sitenotice&#039;&#039; – [[Käyttäjä:Nike|Nike]] 14. toukokuuta 2008 kello 13.32 (EEST)&lt;br /&gt;
&lt;br /&gt;
=== /index.php -&amp;gt; /wiki + /w? ===&lt;br /&gt;
Parannusehdotuksiin liittyen: Voisiko Teppo päivitellä myös MediaWikiä niin, ettei index.php:tä enää näkyisi? Ohjeet löytyvät [http://www.mediawiki.org/wiki/Manual:Short_URL MediaWikin sivuilta]. --[[Käyttäjä:Str4nd|str4nd]] &amp;lt;small style=&amp;quot;color:grey&amp;quot;&amp;gt;([[Keskustelu käyttäjästä:Str4nd|jutskaa]])&amp;lt;/small&amp;gt; 27. lokakuuta 2007 kello 18.29 (EEST)&lt;br /&gt;
&lt;br /&gt;
ModRewritellä pitäisi onnistua Wiki-sivujen osoitteet tyyliin http://linux.fi/Synaptic. Nykyinen tyylli http://linux.fi/index.php/Synaptic on turhan pitkä..--[[Käyttäjä:80.221.60.224|80.221.60.224]] 21. tammikuuta 2008 kello 13.02 (EET)&lt;br /&gt;
&lt;br /&gt;
.htaccess-tiedosto (ei testattu):&lt;br /&gt;
 RewriteRule ^([^/]+).html	/index.php/$1&lt;br /&gt;
&lt;br /&gt;
==Linux.fi==&lt;br /&gt;
Mitä tältä sivulta odotetaan, halutaan tai toivotaan? Wikissä alkaa hiljalleen olla hyvänlaisesti materiaalia, ja foorumi on ilmeisesti piakkoin tulossa. Kertokaapas mitä muuta kivaa tämä sivu voisi suomenkielisille avoimen lähdekoodin käyttäjille tarjota. --[[Käyttäjä:Maakuth|Maakuth]] 12. elokuuta 2007 kello 00.47 (EEST)&lt;br /&gt;
&lt;br /&gt;
== Virallinen suhde [http://lokalisointi.org kotoistamiseen]? ==&lt;br /&gt;
Tulipa tuossa mieleen että mitä ovat täällä wikittelijät mieltä ohjelmien [http://lokalisointi.org kotoistamisesta]? Onhan tuo aika iso osa avoimen lähdekoodin suuntauksista ja eduista, notta olisikohan foorumikohtainen ja/tai yleisempi sanakirja[http://lokalisointi.org/sanakirja/] paikallaan? Emmehän me tahdo [http://fi.wikipedia.org/wiki/Anglismi anglisteiksi] rueta, emmehän? Hieman eppäilyttää jotkut front- ja backendit, rootit ja adminit sun muut, mitkä eivät edes ole varsinaista suomea. Kuulostanee varmaan koomiselta mutta anglismin seurauksena suomenkieli kuihtuu kun riittävän pitkälle ajassa mennään :)&lt;br /&gt;
&lt;br /&gt;
Yours truly,&lt;br /&gt;
&lt;br /&gt;
--[[Käyttäjä:V|V]] @ 8. heinäkuuta 2007 kello 19.49 (EEST)&lt;br /&gt;
:[[Linux.fi:Merkitsemiskäytäntöjä|Merkitsemiskäytännöissä]] ilmaistaan selkeästi tämän wikin kielelliset periaatteet. Joillekin termeille vaan ei välttämättä ole kunnollisia suomennoksia, tai niitä ei kukaan käytä, mistä johtuen pitemmälle ehtinyt harrastaja ei edes tunnista tuttujen termien suomenkielisiä vastineita. Ainakin itse tarkistan aina lokalisointi.orgista, löytyisikö termille jokin suomennos. Alkuperäiset englanninkieliset termit on kuitenkin syytä jättää sulkeisiin suomennoksen ohelle, jotta sen tunnistavat nekin, jotka eivät vielä ole suomennosta nähneet. --[[Käyttäjä:Maakuth|Maakuth]] 8. heinäkuuta 2007 kello 20.18 (EEST)&lt;br /&gt;
:Lisäksi omien sanojensa tueksi voisi kannattaa ottaa vaikkapa kuvankaappaukset suomennetuista ohjelmista englanninkielisten sijaan, ja vältellä häröjä otsikoita kuten &amp;quot;GUI kehoitteet&amp;quot;. Ja se on muuten kehote eikä kehoite :) --[[Käyttäjä:Maakuth|Maakuth]] 8. heinäkuuta 2007 kello 20.49 (EEST)&lt;br /&gt;
::Asia ymmärretty. --[[Käyttäjä:V|V]] 8. heinäkuuta 2007 kello 20.58 (EEST)&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Nimetty_putki&amp;diff=30706</id>
		<title>Nimetty putki</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Nimetty_putki&amp;diff=30706"/>
		<updated>2010-02-15T20:41:28Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: /* Katso myös */ +&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nimetty putki eli FIFO (&amp;quot;First In, First Out&amp;quot;) on tiedostojärjestelmään luotu pysyvä erikoistiedosto, jota käytetään eri prosessien väliseen [[standardivirrat|kommunikointiin]]. Nimettyyn putkeen voivat eri aikoihin tai samanaikaisesti lukea ja kirjoittaa eri prosessit, kun taas tavalliseen nimeämättömään, tilapäiseen putkeen (esim. [[cat]] tiedosto &#039;&#039;|&#039;&#039; [[less]]) ei voi syöttää ja tulostaa kuin kaksi samanaikaisesti toimivaa prosessia.&lt;br /&gt;
&lt;br /&gt;
==Käyttö==&lt;br /&gt;
Nimetty putki luodaan komennolla mkfifo, esimerkiksi&lt;br /&gt;
 mkfifo putki1&lt;br /&gt;
Annetaan yhdessä [[virtuaalikonsoli]]ssa komento&lt;br /&gt;
 [[ls]] -l &amp;gt;putki1&lt;br /&gt;
jolla syötetään tiedostolistaus nimettyyn putkeen putki1. Koska mikään prosessi ei vielä lue ls:n putkeen syöttämää dataa, pysähtyy ls:n suoritus automaattisesti odottamaan vastaanottavaa prosessia. Annetaan seuraavaksi toisessa virtuaalikonsolissa komento&lt;br /&gt;
 cat putki1&lt;br /&gt;
joka tulostaa putkesta saamansa datan näytölle. Kun cat on tulostanut putken kautta ls:ltä saamansa syötteen, loppuu molempien prosessien suoritus automaattisesti (EOF).&lt;br /&gt;
&lt;br /&gt;
Annetaan komento&lt;br /&gt;
 [[bzip2]] -c &amp;lt; putki1 &amp;gt; tavara.bz2 &amp;amp;&lt;br /&gt;
joka laittaa bzip2:n taustalle &amp;quot;vahtimaan&amp;quot; putki1:stä ja pakkaamaan sieltä tulevan datan tiedostoon tavara.bz2.&lt;br /&gt;
&lt;br /&gt;
Kun tämän jälkeen taas ohjataan ls:n tuloste putkeen komennolla&lt;br /&gt;
 [[ls]] -l &amp;gt;putki1&lt;br /&gt;
pakkaa bzip2-prosessi tämän datan ja lopettaa itsensä.&lt;br /&gt;
Pakatun tiedoston sisällön voi tarkistaa vaikkapa komennolla&lt;br /&gt;
 [[bzcat]] tiedosto.bz2&lt;br /&gt;
&lt;br /&gt;
Nimetyn putken voi poistaa normaaliin tapaan komennolla&lt;br /&gt;
 [[rm]] putki1&lt;br /&gt;
&lt;br /&gt;
==Katso myös==&lt;br /&gt;
*[[Putki]] - nimeämätön eli anonyymi putki&lt;br /&gt;
*[[Standardivirrat]]&lt;br /&gt;
*[[Komentorivin perusteet]]&lt;br /&gt;
&lt;br /&gt;
==Aiheesta muualla==&lt;br /&gt;
*[http://www2.linuxjournal.com/article/2156 Linux Journalin artikkeli nimetyistä putkista]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Järjestelmä]]&lt;br /&gt;
[[Luokka:Komentorivi]]&lt;br /&gt;
[[Luokka:Ohjeet]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
	<entry>
		<id>https://www.linux.fi/w/index.php?title=Putki&amp;diff=30704</id>
		<title>Putki</title>
		<link rel="alternate" type="text/html" href="https://www.linux.fi/w/index.php?title=Putki&amp;diff=30704"/>
		<updated>2010-02-15T20:40:35Z</updated>

		<summary type="html">&lt;p&gt;Ordyh: +&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Putkittaminen&#039;&#039;&#039; tarkoittaa toiseen ohjelman [[standardituloste]]en ohjaamista toisen ohjelman standardisyötteelle. Se on erittäin hyödyllinen [[komentotulkki]]&amp;lt;nowiki&amp;gt;operaatio&amp;lt;/nowiki&amp;gt;, jonka hallitseminen yhdessä [[grep]] ja [[less]] -komentojen kanssa on avain Linux- ja Unix-järjestelmien komentotulkin tehokkaaseen hyödyntämiseen. Komentotulkissa putki luodaan operaattorilla &#039;&#039;ohjelma1&#039;&#039; | &#039;&#039;ohjelma2&#039;&#039;. Merkistä | käytetään tässä yhteydessä tämän vuoksi yleensä nimeä &#039;&#039;putki&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Esimerkki ==&lt;br /&gt;
[[cat]] tulostaa [[argumentti]]na annetun tiedoston omalle standarditulosteelleen. [[Less]] ja [[more]] ovat ohjelmia, jotka normaalitilassa vierittävät standardisyötettä ruudullisen kerrallaan. Kun cat:in tuloste putkitetaan less:ille, on tulostettavaa tiedostoa helpompi lukea:&lt;br /&gt;
 cat tiedosto | less&lt;br /&gt;
&lt;br /&gt;
Putkitettavan tulosteteen ei tarvitse välttämättä olla tekstiä, vaan mitä tahansa dataa voidaan ohjata putkeen. Jos tiedosto &#039;&#039;kuva.png.gz&#039;&#039; on [[gzip]]illä pakattu [[PNG]]-kuvatiedosto, se voidaan katsoa [[ImageMagick]]in &#039;&#039;display&#039;&#039; komennolla X-ikkunassa seuraavasti:&lt;br /&gt;
 gunzip -c kuva.png.gz | display -&lt;br /&gt;
Tässä gzip-jakeluun kuuluva gunzip on purkaa pakatun tiedoston &#039;&#039;kuva.png.gz&#039;&#039;. Gunzipin [[valitsin]] -c ohjaa puretun datavirran (siis alkuperäisen, pakkaamattoman kuvatiedoston) [[standardituloste]]elle. ImageMagickin displayn argumenttina on näytettävän kuva tiedostonimi. Tiedostonimi väliviiva (-) on yleinen tapa kertoa ohjelmalle, että tiedostoa ei lueta [[tiedostojärjestelmä]]stä lainkaan, vaan se annetaan datavirtana ohjelman standardisyötteelle. Lopputuloksena ImageMagick siis lukee gunzip:in purkaman tiedoston ja näyttää sen käyttäjälle.&lt;br /&gt;
&lt;br /&gt;
Putkia voi olla myös useita peräkkäin, ja niitä voi yhdistellä komentotulkin [[uudelleenohjaus]]&amp;lt;nowiki&amp;gt;operaattoreihin&amp;lt;/nowiki&amp;gt; mielivaltaisesti. Seuraava komento poistaa tiedostosta &#039;&#039;kayttajat.txt.gz&#039;&#039; identtiset rivit komennolla [[uniq]], ja lopuksi pakkaa tiedoston uudelleen, sekä ohjaa pakatun tulosteen tiedostoon &#039;&#039;kayttajat-uniq.txt.gz&#039;&#039;&lt;br /&gt;
 gzip -c kayttajat.txt.gz | uniq | gzip -c - &amp;gt; kayttajat-uniq.txt.gz&lt;br /&gt;
&lt;br /&gt;
== Standardivirhe ==&lt;br /&gt;
Putkitusoperaattori | ohjaa vain ohjelman standarditulosteen toiselle ohjelmalle. Minkä tahansa putkessa esiintyvän ohjelman virheilmoitukset tulostuvat siksi suoraan [[terminaali]]in. Koska jokaisella ohjelmalla on vain kaksi ulostuloa (standardituloste ja -virhe) mutta vain yksi sisääntulo (standardisyöte), pitää standardivirhe ohjata erikseen standardi&#039;&#039;&#039;tulosteelle&#039;&#039;&#039;, jotta se voitaisiin putkittaa toiselle ohjelmalle. Tämä tapahtuu komentamalla&lt;br /&gt;
 &#039;&#039;ohjelma1&#039;&#039; 2&amp;gt;&amp;amp;1 | &#039;&#039;ohjelma2&#039;&#039;&lt;br /&gt;
Jos jonkin putkessa olevan ohjelman standardivirhettä ei haluta putkittaa toiselle ohjelmalle, mutta sitä ei myöskään haluta näkyville terminaaliin, se voidaan ohjata erikoistiedostoon [[null|/dev/null]] esimerkiksi seuraavasti:&lt;br /&gt;
 &#039;&#039;ohjelma1&#039;&#039; | &#039;&#039;ohjelma2&#039;&#039; 2&amp;gt; /dev/null | &#039;&#039;ohjelma3&#039;&#039;&lt;br /&gt;
Tämä ohjaa &#039;&#039;ohjelma2&#039;&#039;:n mahdolliset virheilmoitukset null:ille. &#039;&#039;ohjelma1&#039;&#039;:n ja &#039;&#039;ohjelma3&#039;&#039;:n virheilmoitukset tulostuvat normaalisti terminaaliin.&lt;br /&gt;
&lt;br /&gt;
== Katso myös ==&lt;br /&gt;
* [[Komentorivin perusteet]]&lt;br /&gt;
* [[Nimetty putki]]&lt;br /&gt;
&lt;br /&gt;
[[Luokka:Komentotulkit]]&lt;br /&gt;
[[Luokka:Perustietoa]]&lt;/div&gt;</summary>
		<author><name>Ordyh</name></author>
	</entry>
</feed>