next up previous contents
Nästa: 11. Grundläggande Bashprogrammering Upp: 10. Textbehandling Förra: 10.1 Reguljära mönster

10.2 Redigering i förbifarten

Programmet sed är (bland annat) till för att automatisera textredigering. Det skapades genom en enkel bearbetning av editorn ed. Det läser in en text i form av indata eller från en fil, utför redigeringskommandon på en textrad i taget, och skriver sedan ut raden i sin nya form. Den ursprungliga filen ändras inte.

En av de redigeringar sed kan göra är substitutionen ''Byt söktext mot ersättningstext''; det skrivs s/söktext/ersättningstext/. Söktexten kan vara ett reguljärt mönster. I stället för tecknet / kan man välja något annat förutsatt att samma tecken används på alla tre ställen i kommandot.

Flaggan -e anger att nästa argument är ett kommando till sed och inte ett filnamn. Så här byter vi ut ''du'' mot ''DU'' i filen bellman:$ sed -e 's/du/DU/' bellman
Så lunka vi så småningom
från Bacchi buller och tumult,
när döden ropar: Granne, kom,
     ditt timglas är nu fullt.
Du gubbe, fäll din krycka ner,
och DU, du yngling, lyd min lag:
den skönsta nymf, som åt dig ler,
     inunder armen tag.
Tycker DU, att graven är för djup,
nå välan, så tag dig då en sup,
tag dig se'n dito en, dito två, dito tre,
     så dör DU nöjdare.
$
I utskriften har den första förekomsten av ''du'' på varje rad bytts ut mot ''DU''. Det är oftast nödvändigt att skydda redigeringskommandona med apostrofer, så det är bra att göra det till en vana att alltid ha dem med.

Om alla förekomster ska bytas ut, så ska man ange flaggan g i slutet av substitutionskommandot:$ sed -e 's/[dD]u/DU/g' bellman
Så lunka vi så småningom
från Bacchi buller och tumult,
när döden ropar: Granne, kom,
     ditt timglas är nu fullt.
DU gubbe, fäll din krycka ner,
och DU, DU yngling, lyd min lag:
den skönsta nymf, som åt dig ler,
     inunder armen tag.
Tycker DU, att graven är för djup,
nå välan, så tag dig då en sup,
tag dig se'n dito en, dito två, dito tre,
     så dör DU nöjdare.
$
I stället för g kan man ange ett nummer n, och då byts bara den n:te förekomsten på varje rad ut.

Flaggan -n gör så att ingen rad automatiskt skrivs ut:$ sed -ne 's/[dD]u/DU/g' bellman
$
Flaggan p i substitutionskommandot anger att de rader som innehåller söktexten ska skrivas ut:$ sed -ne 's/[dD]u/DU/gp' bellman
DU gubbe, fäll din krycka ner,
och DU, DU yngling, lyd min lag:
Tycker DU, att graven är för djup,
     så dör DU nöjdare.
$
Tecknet & i ersättningstextentexten står för det som matchas av söktexten.$ sed -ne 's/[dD]u/(&)/gp' bellman
(Du) gubbe, fäll din krycka ner,
och (du), (du) yngling, lyd min lag:
Tycker (du), att graven är för djup,
     så dör (du) nöjdare.
$

Programmet åäö nedan ger ett typiskt exempel på hur sed används.

#!/bin/bash
if [ $# -ne 1 ] ; then
  echo "Ange exakt ett argument" 1>&2
  exit 1
fi
if [ ! -f "$1" ] ; then
  echo "Filen $1 finns inte" 1>&2
  exit 1
fi
mv "$1" "$1.kopia"
sed \
-e 's/å/\å/g' -e 's/ä/\ä/g' -e 's/ö/\ö/g' \
-e 's/Å/\å/g' -e 's/Ä/\Ä/g' -e 's/Ö/\Ö/g' \
"$1.kopia" > "$1"

Programmet tar ett argument, som ska vara namnet på en fil. Först kontrolleras det att antalet argument är 1. Om inte, så avslutas programmet med ett näsvist felmeddelande. Likaså avslutas programmet om argumentet inte är namnet på en befintlig fil. Filen kopieras sedan till en ny fil som ges ett namn med ändelsen .kopia. Sedan byts bokstäverna åäöÅÄÖ ut mot textsträngar som motsvarar dem i språket HTML, och resultatet sparas i en fil med samma namn som den ursprungliga. Lägg märke till att &-tecknen i ersättningstexten måste skyddas.

Antag nu att det i katalogen /tmp finns en HTML-fil:$ ls /tmp
test.html
$ cat /tmp/test.html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<title>Test av åäö</title>
</head>
<body>
<h1>Test av åäö</h1>
Det här är en testfil för
mitt lilla program "åäö"!
</body>
</html>
$
Låt oss köra programmet på filen:$ åäö /tmp/test.html
$ ls /tmp
test.html test.html.kopia
$ cat /tmp/test.html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<title>Test av &aring;&auml;&ouml;</title>
</head>
<body>
<h1>Test av &aring;&auml;&ouml;</h1>
Det h&auml;r &auml;r en testfil f&ouml;r
mitt lilla program "&aring;&auml;&ouml;"!
</body>
</html>
$
Ett visst mått av felhantering finns i programmet:$ åäö bellmna
Filen bellmna finns inte
$ åäö bellman lenngren
Ange exakt ett argument
$


next up previous contents
Nästa: 11. Grundläggande Bashprogrammering Upp: 10. Textbehandling Förra: 10.1 Reguljära mönster
Goran Andersson
1999-03-08