Sed

sed (stream editor) muokkaa tekstiä rivi kerrallaan komentojonon perusteella — ei vaadi tiedoston avaamista editorissa.

Perusmuoto (korvaus)

sed 's/vanha/uusi/' tiedosto            # korvaa ensimmäisen osuman jokaisella rivillä
sed 's/vanha/uusi/g' tiedosto            # korvaa kaikki osumat joka rivillä (global)
sed 's/vanha/uusi/gi' tiedosto             # korvaa, ei väliä kirjainkoolla
sed 's/vanha/uusi/2' tiedosto               # korvaa vain rivin 2. osuma
komento | sed 's/vanha/uusi/g'                # putkessa

Paikallaan muokkaus (-i)

sed -i 's/vanha/uusi/g' tiedosto            # GNU sed (Linux)
sed -i '' 's/vanha/uusi/g' tiedosto           # BSD sed (macOS) — vaatii tyhjän varmuuskopiopäätteen argumentin
sed -i.bak 's/vanha/uusi/g' tiedosto            # molemmat: tekee varmuuskopion tiedosto.bak

Tämä on yleisin sudenkuoppa macOS:lla: BSD sed vaatii -i:n jälkeen aina jonkin argumentin (vaikka tyhjän ''), GNU sed ei. Ilman tätä eroa komento joko epäonnistuu tai luo vahingossa tiedoston nimeltä s.

Osoitteet (mille riveille komento kohdistuu)

sed '3s/vanha/uusi/' tiedosto           # vain rivi 3
sed '2,5s/vanha/uusi/' tiedosto           # rivit 2–5
sed '/aloitus/,/lopetus/s/vanha/uusi/' tiedosto   # rivien "aloitus" ja "lopetus" välissä
sed '$s/vanha/uusi/' tiedosto              # vain viimeinen rivi
sed -n '3,5p' tiedosto                       # tulosta vain rivit 3–5 (-n hiljentää oletustulostuksen)

Rivien poisto

sed '3d' tiedosto             # poista rivi 3
sed '2,5d' tiedosto             # poista rivit 2–5
sed '/^#/d' tiedosto              # poista kommenttirivit (alkavat #:llä)
sed '/^$/d' tiedosto                # poista tyhjät rivit

Capture-ryhmät ja takaisinviittaukset

sed -E 's/([a-z]+)@([a-z]+)/\2@\1/' tiedosto   # vaihda @-merkin ympärillä olevat osat keskenään
sed 's/.*/[&]/' tiedosto                          # & viittaa koko täsmäävään osuun

-E (tai -r GNU sed:issä) ottaa käyttöön laajennetun regexin, jolloin ()- ja +-merkkejä ei tarvitse erikseen escapoida \:lla.

Useampi komento

sed -e 's/a/b/' -e 's/c/d/' tiedosto
sed 's/a/b/; s/c/d/' tiedosto     # sama, puolipisteellä eroteltuna

Yleisiä käytännön esimerkkejä

sed -n '10,20p' loki.txt                  # näytä vain rivit 10–20
grep -rl "vanha" . | xargs sed -i 's/vanha/uusi/g'   # korvaa kaikissa hakemiston tiedostoissa
sed 's/[[:space:]]*$//' tiedosto            # poista rivien lopusta ylimääräiset välilyönnit
sed = tiedosto | sed 'N;s/\n/\t/'             # numeroi rivit

sed vs. muokkaus editorissa

sed sopii kertaluontoisiin, skriptattaviin tai massamuokkauksiin (esim. saman muutoksen tekeminen sadalle tiedostolle CI-liukuhihnassa) — interaktiiviseen, harkinnanvaraiseen muokkaukseen sopii paremmin tavallinen editori (ks. Vim- tai Nano-lunttilappu).