next up previous contents
Nästa: 3.2 Jobb Upp: 3. Kommandotolken Förra: 3. Kommandotolken

3.1 Jokertecken

Antag att en viss katalog innehåller följande filer:$ ls
epistel23.text   epistel28.text~  fredman.html~    haga.sång~
epistel25.text   epistel36.text   fredman.ps       movitz.html
epistel28.text   fredman.html     haga.sång        winblad.html
$
Om vi nu vill radera alla filer vars namn slutar med ett tildetecken så kan vi ge kommandot rm epistel28.text~ fredman.html~ haga.sång~. Men det känns lite omständligt att behöva räkna upp alla dessa filer. Lyckligtvis finns det ett enklare sätt. Man kan nämligen referera till flera filer samtidigt med hjälp av jokertecken.

Jokertecknen är *, ? och [. Om ett argument innehåller något av dessa tecken, så tolkar skalet argumentet som ett mönster som ska paras ihop med namnen på filerna (och katalogerna) i den nuvarande katalogen. Om ett eller flera av filnamnen ''matchar'' mönstret så skriver skalet om kommandot man gav genom att byta ut mönstret mot en alfabetiskt sorterad lista av de filnamn som matchar mönstret. Om mönstret däremot inte matchas av något filnamn, så görs inga omskrivningar, utan skalet lämnar då mönstret som det är.

Jokertecknet * matchar vilken som helst följd av noll eller flera tecken. Mönstret *~ matchar därför precis de filnamn som slutar med ett tilde. För att radera alla filer vars namn slutar med tilde kan vi tydligen ge kommandot rm *~. Detta kommando skriver skalet (utan att det syns) om till rm epistel28.text~ fredman.html~ haga.sång~ innan det exekveras. Tolkningen görs alltså av skalet - kommandon som tex rm vet ingenting om jokertecken.$ rm *~
$ ls
epistel23.text  epistel36.text  haga.sång
epistel25.text  fredman.html    movitz.html
epistel28.text  fredman.ps      winblad.html
$

  
Figur 3.1: Skalet skriver om ett kommando.
\begin{figure}
\begin{center}
\psframebox[framesep=1.1]{
\begin{psmatrix}
\p...
...ows=->]{1,1}{2,1}\tlput{Omskrivning}
\end{psmatrix} }
\end{center}\end{figure}

I de följande exemplen, där vi inte gör något meningsfullt utan bara demonstrerar hur jokertecken fungerar, ska vi använda kommandot echo som ju skriver ut sina argument exakt som de är. Då får vi se hur argumenten såg ut efter omskrivningen.

Mönstret epistel* matchar alla de filer vars namn börjar med ''epistel'':$ echo epistel*
epistel23.text epistel25.text epistel28.text epistel36.text
$
Så här väljer man ut alla filer vars namn slutar med .html:$ echo *.html
fredman.html movitz.html winblad.html
$
Det finns ingen fil vars namn slutar med .htm:$ echo *.htm
*.htm
$
Här ser vi att skalet skickar mönstret vidare oförändrat ifall det inte matchar något filnamn.

Det får förekomma jokertecken i fler än ett av argumenten:$ echo winblad.* fredman.*
winblad.html fredman.html fredman.ps
$
Man får också använda flera jokertecken i samma mönster:$ echo e*3*t
epistel23.text epistel36.text
$ echo *n*
fredman.html fredman.ps haga.sång winblad.html
$
På detta sätt fann vi alla filnamn som innehåller bokstaven n.

Jokertecknet ? matchar ett (exakt ett) godtyckligt tecken.$ echo epistel2?.text
epistel23.text epistel25.text epistel28.text
$ echo *.??
fredman.ps
$
Mönstret *.?? matchar de filer vars namn slutar på en punkt följt av exakt två tecken.

Det finns två undantag mot reglerna för jokertecken. Det ena undantaget är att tecknet / måste anges uttryckligen i mönstret. Så till exempel matchar mönstret /etc/*wd filnamnet /etc/passwd men inte filnamnet /et*wd.$ echo /et*wd
/et*wd
$ echo /etc/*wd
/etc/passwd
$ echo /usr/*/emacs
/usr/bin/emacs /usr/doc/emacs /usr/lib/emacs
$
Det andra undantaget är att filnamn som inleds med en punkt endast matchas av mönster som också inleds med en punkt.$ echo .*
. .. .bash_history .bash_profile .bashrc .inputrc
$ echo .ba*
.bash_history .bash_profile .bashrc
$

Om man vill att mönstret ska matcha bara vissa utvalda tecken, så behövs andra hjälpmedel än * och ?, nämligen [...]. Mellan hakparenteserna ska man räkna upp ett antal tecken, och då tolkar skalet detta som ett mönster som matchar ett (exakt ett) av de uppräknade tecknen. Till exempel matchar [058] ett valfritt av tecknen 0, 5 och 8:$ echo epistel2[058].text
epistel25.text epistel28.text
$
Man kan också ange intervall, [3-7] matchar 3, 4, 5, 6 eller 7, och [a-d] matchar a, b, c eller d.$ echo epistel2[3-7].text
epistel23.text epistel25.text
$ echo *.[a-r]*
fredman.html fredman.ps movitz.html winblad.html
$
Om man vill att mönstret ska matcha alla tecken som inte är uppräknade, så ska man ange tecknet ^ direkt efter [. Mönstret [^te-h] matchar alltså exakt ett tecken som inte är något av t,e,f,g eller h.$ echo *[^te-h]
fredman.html fredman.ps movitz.html winblad.html
$
(Man kan använda ! som en synonym för ^.)

Låt oss avslutningsvis nämna en liten komplikation: Hur kan man ange ett mönster som ska matcha exakt ett av tecknen 2, - och 5? Inte som 2-5, för då tolkas det som 2,3,4 eller 5. Men om man sätter tecknet - först eller sist, som i [-25], så förstår skalet att man inte syftar på ett intervall. På motsvarande sätt gäller att om man vill räkna upp ett antal tecken varav ett är ], så ska man ange detta först. Exempelvis matchar []aö] ett av tecknen ], a och ö.


next up previous contents
Nästa: 3.2 Jobb Upp: 3. Kommandotolken Förra: 3. Kommandotolken
Goran Andersson
1999-03-08