programmera.net -> linux -> normal     för utskrift      info@programmera.net

Programmet sed

  Kommando    Exempel  Beskrivning
  s=substitute  sed '/foo/ s/hej/svej/g' a.txt  Skriver ut a.txt med hej utbytt till svej på alla rader som innehåller strängen foo.
  d=delete  sed '/foo/ d' a.txt  Skriver ut a.txt utom de rader som innehåller foo.
  a=append  sed '/foo/ a\ en liten rad' a.txt  Skriver ut a.txt men lägger till en rad med texten "en liten rad" efter de rader som innehåller foo.
  i=insert  sed '/foo/ i\ en liten rad' a.txt  Skriver ut a.txt men lägger till en rad med texten "en liten rad" innan de rader som innehåller foo.
  c=change  sed '/foo/ c\ en liten rad' a.txt  Skriver ut a.txt men ersätter alla rader som innehåller foo med texten "en liten rad" .

Namnet SED betyder stream editor. Programmet används till att förändra text från en fil. Man kan använda reguljära uttryck tillsammans med sed. Programmet arbetar med filer genom att tolka en rad i taget. Varje rad berabetas och skickas sedan till standard output. SED används framför allt när du har stora filer där varje rad är uppbyggd på samma sätt, och du vill utföra en förändring som påverkar alla rader i filen. SED tar olika kommandon som input, men det definitivt vanligaste är 's'. SED tar också oilka flaggor, nedan visas några exempel:
Flagga  Betydelse  Beskrivning
sed -e 's/a/x/g' -e 's/b/y/g' a.txt  expression  Skriver ut a.txt med alla a utbytta mot x och alla b utbytta mot y.
sed -f commands.txt a.txt  file  Skriver ut a.txt med alla substitutioner som listas i filen commands.txt.


s=substitute

Kommandot s (=substitute) är det viktigaste kommandot du behöver kunna när du använder sed. Med detta kommando kan du göra följande:
  • Ersätta en del av raden. Ex: 's/gammalt/nytt/'. Här kommer sed att leta efter texten "gammalt" och ersätta den texten med "nytt".
  • Ta bort en del av raden. Ex: 's/gammalt//'. Här kommer sed att leta efter texten "gammalt" och ersätta den med ingenting, vilket betyder att den försvinner.
  • Lägga till ny text i raden. Ex: 's/gammalt/jätte gammalt/'. Här kommer sed att leta efter texten "gammalt" och lägga till texten "jätte " före "gammalt" .
Ofta används reguljära uttryck för att matcha den text som ska ersättas/tas bort. Nedan följer några exempel:

Exempel Beskrivning
sed 's/foo/x/' a.txt  Skriver ut a.txt med den första förekomsten av foo på varje rad ersatt med x.
sed 's/foo/x/g' a.txt  Skriver ut a.txt med alla förekomster av foo ersatta med x.
sed 's/foo//g' a.txt  Skriver ut a.txt med alla förekomster av foo raderade.
sed 's/^foo/x/' a.txt  Skriver ut a.txt med alla rader som börjar på foo ersatta med x istället för foo.
sed '/foo/ s/a/x/g' a.txt  Skriver ut a.txt och ersätt a med x på alla rader som innehåller strängen foo.
sed '1,10 s/a/x/g' a.txt  Skriver ut a.txt och ersätt a med x på raderna 1 t.o.m. 10.

Vi tänker oss att vi har en fil c.txt med följande innehåll:
[olle@dev1]$ cat c.txt
hej alla
glada
katter
Om jag t.ex. vill ersätta "le" med "xx" på alla ställen i filen c.txt skriver jag:
[olle@dev1]$ sed 's/le/xx/g' c.txt
hej alxx
gxxda
katter
OBS! sed ersätter bara första förekomsten av det sökta ordet om man inte använder ett g på slutet.
[olle@dev1]$ sed 's/a/x/' c.txt
hej xlla
glxda
kxtter
Här testar vi ett reguljärt uttryck:
[olle@dev1]$ sed 's/...a$/x/' c.txt
hej x
gx
katter
Vi ser att alla rader som slutar på a får sina sista 4 tecken ersatta med x. Nu testar vi att lägga till ny text utan att radera något gammalt:
[olle@dev1]$ sed 's/^/xx/' c.txt
xxhej alla
xxglada
xxkatter
Varje rad fick texten "xx" adderade som första två tecken.
d=delete

Kommandot d (=delete) används för att ta bort hela rader. Det är inte så ofta som sed används till detta, istället används grep för att välja ut/ta bort enskilda rader ur en fil.

Exempel Beskrivning
sed 'd' a.txt  Skriver ut a.txt med alla raderna raderade d.v.s ingenting.
sed '/foo/ d' a.txt  Skriver ut a.txt utom de rader som innehåller foo.
sed '1,10 d' a.txt  Skriver ut a.txt utom raderna 1 t.o.m. 10.

Vi tänker oss att vi har en fil c.txt med följande innehåll:
[olle@dev1]$ cat c.txt
hej alla
glada
katter
Här tar vi bort alla rader som innehåller "e":
[olle@dev1]$ sed '/e/ d' c.txt
glada

a=append

Med kommandot a (=append) lägger vi till nya rader efter de rader som uppfyller vårt sökkriterium.

Exempel Beskrivning
sed 'ahej' a.txt  Skriver ut a.txt med en extra rad innehållande texten hej efter varje rad.
sed '/foo/ ahej' a.txt  Skriver ut a.txt med en extra rad innehållande texten hej efter varje rad som innehåller foo.

Vi tänker oss att vi har en fil c.txt med följande innehåll:
[olle@dev1]$ cat c.txt
hej alla
glada
katter
Vi lägger till en rad "xx" efter varje rad som innehåller "e":
[olle@dev1]$ sed '/e/ axx' c.txt
hej alla
xx
glada
katter
xx

i=insert

Kommandot i (=insert) fungerar som kommandot a, fast den nya raden adderas ovanför den matchade raden. Vi tänker oss att vi har en fil c.txt med följande innehåll:
[olle@dev1]$ cat c.txt
hej alla
glada
katter
Vi lägger nu till en rad "xx" före varje rad som innehåller "e":
[olle@dev1]$ sed '/e/ ixx' c.txt
xx
hej alla
glada
xx
katter

c=change

Kommandot c (=change) ersätter en hel rad med en given text. Vi tänker oss att vi har en fil c.txt med följande innehåll:
[olle@dev1]$ cat c.txt
hej alla
glada
katter
Vi ersätter nu alla rader som innehåller "e" med "xx":
[olle@dev1]$ sed '/e/ cxx' c.txt
xx
glada
xx