http://forum.ubuntu-fi.org/index.php?topic=45247.msg347720#msg347720

- sed editoi sille osoitetun tekstin ja tulostaa editoidun tekstin näytölle ellei toisin määrätä. 
- teksti voidaan osoittaa sed:ille esimerkiksi seuraavasti: tulosta_jotenkin | sed .....          tai: sed ..... <<< tulosta_jotenkin 
- tekstiä voi olla yksi- tai monta riviä. 
- sed käy läpi sille annetun tekstin rivi-riviltä järjestyksessä kun sille annetaan tekstitiedosto. Tätä käyttäytymistä ei edes
  voi muuttaa.
- mikäli peräkkäin on useampia sed:ejä niin sana sed kirjoitetaan vain kerran ja käskyt erotetaan kuten seraavassa esimerkissä:  
  sed -e '/^#/d' -e 's/#.*$//' tiedostonimi # poistetaan kommenttirivit ja kommentit pitemmältä  
- jokaisen tiedoston rivit on aina numeroitu, sitä ei vain aina näytetä. Rivit numeroidaan järjestyksessä ykkösestä alkaen.
- sed käy normaalisti läpi tiedoston kaikki rivit alkaen ykkösestö ja siitä järjestyksessä eteenpäin. sed:issä voidaan kuitenkin antaa
  osoitteita. osoitteet ovat joko rivinumeroita tai jokin tekstinpalanen joka löytyy osoitetuilta riveiltä. jos osoitteita on vain yksi niin muokkaaminen koskee vain 
  sitä riviä ja jos osoitteita on kaksi niin muokataan rivejä niiden välissä.
- jos toiminta juuttuu jonnekin kun ollaan sed:issä paina CNTRL-c.
- tiedoston teksti tulee näytölle jokatapaukseessa. Jos haluat muutoksen tallentuvan myös tiedostoon niin kirjoita: sed -i ...
- jos et halua tekstimuutoksen kirjoittuvan näytölle niin kirjoita: sed -n ... 
- ihan rauhassa voi käskeä: sed 's/apu/apua/g'  sillä se ei päädy päättymättömään looppiin.
- kirjainkoko vaikuttaa. Jotenkin se on vaikeaa muistaa.
- sed ei koskaan kysy mitään.
- sed-ohjelmasta voidaan kutsua toista sed:iä.
- mikäli tärkeää syytä ei ole, niin tulisi käyttää kovia lainausmerkkejä elikä '-merkkejä. Mutta BASH:illa ei ole otetta esimerkiksi kovien lainaussmerkkien
  välisistä muuttujista kun sensijaan pehmeiden lainausmerkkien välisistä muuttujista on.

- sed lukee käsiteltävän "pattern-spaceen" jonka se sitten käsittelee ja tallettaa tuloksen "holding-areaan". Sed voi käsitellä 
  näitä muistialueita seuraavilla käskyillä:
  g   siirrä holding-area pattern-spaceen sen vanhan sisällön tilalle.
  G   siirrä holding-area pattern-spaceen perään laittaen niiden väliin eroittimeksi rivinsiirron. Osoitteita saa olla korkeintaan kaksi.
  h   siirrä pattern-space holding-areaan sen vanhan sisällön tilalle.
  H   siirrä pattern-space holding-arean perään ja laittaen niiden väliin erottimeksi rivinsiirron
  x   vaihda spacet keskenään. Osoitteita saa olla korkeintaan kaksi.
   
- sed:in eteen voi laittaa määreitä kuinka se kyseisellä kerralla toimii:
  -n sed tulostaa aina myös sisääntulevan kun sille laitetaan perään tulostuskäsky: ;p ellei määrätä parametria -n. 
  -i kirjoitetaan muutettu teksti takaisin samaan tiedostoon. -i: tekemiä muutoksia ei joskus voi perua. Turvallisempi on määrätä -i.bak
     joka kirjoittaa vanhan tiedoston ensin nimelle *.bak
  -r käytetään kun halutaa muutta regex:ien tulkiksi Extended-expressions
  -e sed-käskyjen eroitin. Eroittimena voidaan käyttää myös merkkiä ; -e tulee olla parametreista viimeisenä kun parametreja on useampia 
  - teoriassa sed tulisi laittaa koviin lainaiusmerkkeihin. Mutta tämä estää BASH:ia sorkkimasta sed-lausetta. Kuitenkin senjälkeen kun BASH on sorkkinut niin se antaa
    kontrollin sed:ille joten BASH pääsee sorkkimaan vain kerra alussa. Esimerkiksi laus: seq 5 | sed 's/.*/'$((RANDOM))'/g' tuottaa viisi samaa satunnaislukua.  

 # delete duplicate, nonconsecutive lines from a file. Beware not to
 # overflow the buffer size of the hold space, or else use GNU sed.
 sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'
 
Esimerkkejä:
sed -e 'd'                               # tulosta yhtämonta tyhjää kuin käsiteltävässä on rivejä elikkä älä tee mitään.
sed -e '1d'                              # tulosta tiedosto ilman osoitettua riviä, tässä tapauksessa riviä 1
sed -e '1!d'                             # tulosta tiedostosta ainoastaan osoitettu rivi
sed ':'                                  # tulostaa koko tiedoston -> cat
sed 1q                                   # tulosta vain ensimmäinen rivi. 1:n paikalla voi olla joku muukin rivinumero
sed -n '$p'                              # tulosta vain viimeinen rivi - siis merkki $ on viimeisen rivi rivinumero.
sed -e '1,5!d'                           # tulosta 5 ensimmäistä riviä -> head -n 5
sed -e '1,10d'                           # tulosta tiedosto ilma osoitettua lohkoa 
sed -n '2,5p'                            # tulosta rivit 2-5. a=2;b=5;sed -n ""$a","$b"p" toimii myös, mutta ei toimi kovilla heittomerkeilä
sed -n '/kortti/p'                       # tulosta rivit joilla on kortti
sed -n '/kortti/{n;p}'                   # tulosta rivien joilla on kortti jälkeinen rivi
sed -n '/a\+b\+/p'                       # tulosta rivit joilla on yksi tai useampi a ja yksi tai useampi b. Tässä + on normaali RegExp
                                           merkitykseltään "yksi tai useampi" ja sen eteen täytyy laittaa \ .
sed -e ''                                # tulosta koko tiedosto
sed -n '/^#/p'                           # tulosta vain kommenttirivit
sed '5p'                                 # tulosta vain rivi5
sed '8,12!d'                             # tulosta rivit 8-12
sed '8,12d'                              # tulosta kaikki muut rivit paitsi 8-12 
sed '4!d'                                # tulosta ainoastaan tiedoston rivin 4 . Sama kuin sed -n '4p' tai: awk 'NR==4'
sed '/kortti/!d'                         # tulosta rivit joilla lukee jossain kortti
sed '/AAA\|BBB\|CCC/b;d'                 # tulosta mikäli jossan on AAA tai BBB tai CCC 
sed '/[0-9]/p'                           # tulostaa rivit joilla on yksikin numero
sed '/[0-9]/d'                           # tulostaa rivit joilla ei ole yhtään numeroa
sed -n '/[0-9]\{2\}/p'                   # tulostaa rivit joilla on peräkkäin vähintään kaksi numeroa; 2:sta voi muuttaa

sed '/^kortti/!d'                        # tulosta rivit joilla lukee rivin alussa kortti
sed -n '/begin/,/end+/ { p }'            # tulosta lohko jo alkaa sanalla begin ja päättyy sanaan end ja kirjoita lohkojen väliin tyhjä rivi 
sed -n -e '/regexpA/,/regexpB/p'         # tulosta lohko 
sed -n '/GREEN/,$p'                      # tulosta riviltä jolla lukee: GREEN tiedoston loppuun
sed -e '/^#/d' -e 's/#.*$//'             # tulosta kaikki muut kuin kommenttirivit ja kommentit pitemmältä riveistä
sed '/.../d'                             # tulosta 1-2 merkkiset rivit -> rivinvaihto ja tab ovat yksi merkki  
sed -e :a -e '/$/N;s/\n/ /;ta'           # tulosta kaikki yhteen riviin 
sed -e '/^[<space><tab>]*$/d' somefile   # tulosta tiedoston jättäen pois rivit jotka ovat pelkkää välilyöntia tai tabulaattoria
sed 'G'                                  # tulosta tiedosto lisäten tyhjän rivin jokaisen tekstirivin perään
sed -e '/./{H;$!d;}' -e 'x;/hakusana/!d' # tulosta jokainen kappale jossa on määriteltävä-hakusana
sed 'p'                                  # tulosta jokaisen rivin kahteen kertaan
sed '11 q'                               # tulosta 11 riviä alusta.
sed -n '/PATTERN/ =' file                # tulosta rivinumerot joilta haettu löytyy  (tulostaa vain numerot )

sed 'G'                                  # tulosta rivin rivien väliin tyhjän rivin. "double space".
sed -n '1!G;h;$p                         # tulosta rivit käänteisessä järjestyksessä.
sed -e '/./{H;$!d;}' -e 'x;/kortti/!d'   # tulosta kappalleet joista löytyy sana kortti
sed -n '/kortti/{g;1!p;};h'              # tulosta rivit  joiden edellisellä rivillä on sana kortti
sed -n -e '/^$/{x;d}' -e '/./x;p'        # tulosta kaikki muu paitsi kappaleiden viimeinen rivi
sed ':x; /\\$/ { N; s/\\\n//; tx }'      # tulosta tiedosto ja rivin päättyessä merkkiin \ ei merkkiä \ tulosteta eikä myöskään rivinsiirtoa
sed 's/mikä/miksi/g'                     # muuttaa jokaisen sanan:mikä sanaksi:miksi 
sed -i ':a;N;$!ba;s/jotakin\n/,/g'       # muuttaa sanan jotakin\n välilyönniksi - ei onnistu muullatavoin
sed 5!s/ham/cheese/                      # muuttaa sanan 'ham' sanaksi 'cheese' kaikkialla paitsi rivillä 5
sed /awk/!s/aaa/bb/                      # muuttaa sanan 'aaa' sanaksi 'bb' kaikkialla paitsi rivillä jolla lukee sana awk 
sed -i 's/^[[:space:]]*$//g'             # muuttaa tiedostosta rivit joilla on ihmisen mielestä tyhjää sellaisiksi jotka ovat koneenkin mielestä tyhjää 
sed -i '' -e 's/mikä/miksi/g' $(find kansio -type f) # muuttaa kansiosta ylöspäin kaikissa tiedostoissa
sed -i.bak 's/mikä/miksi/g'              # muuttaa samoin, mutta kirjoittaa muutoksen tiedostoonkin tehden ensin backupin
sed "s/$mikä/$miksi/g"                   # muuttaminen BASH:in muuttujan arvoon- Siis sed:issä voi käyttää varoen käyttää pehmeitäkin sulkuja, awk:issa ei
sed "s/\b$mikä\b/$miksi/g"               # muuten sama kuin edellinen, mutta mikä täytyy rajoittua sana rajaan (rivin alku/loppu, välilyönti, mat-operaattori ...)
sed '/tag/s/>[^>].*</>miksi</'           # muuttaa sanan mikä sanaksi miksi kun muutosolosuhteet ovat: echo "abcd<tag>mikä</tag>efgh" | sed '/tag/s/>[^>].*</>miksi</'
sed "s/$mikä-/$miksi/g"                  # muuten sama kuin edellinen, mutta miinusmerkki pitää aina olla hakusanan lopussa
sed '1,2s/mikä/miksi/g'                  # sama kuin edellinen, mutta vain riveillä 1,2
sed 's/mikä/miksi/4'                     # sama kuin edellinen, mutta vain kun se esiintyy neljännen kerran
sed 's/.*mikä.*/miksi/g'                 # muuttaa koko lauseen missä se sana:mikä on sanaksi:miksi
sed -e "s/[ ]\+/,/g"                     # muuttaa peräkkäiset välit yhdeksi pilkuksi
sed -r 's/^(.)\1{1,}$//g'                # muuttaa perättäisistä samoista merkeistä muodostuvatv rivit tyhjiksi
sed 's/\(.*\)a/\1b/'                     # muuttaa viimeinen a b:ksi 
sed -i 's/mikä/miksi/g'                  # muuttaa sanan mikä sanaksi miksi ja tiedoston teksti muutetaan myös
sed '/mikä/ s/mikä/miksi/g'              # sama muutos, mutta hieman nopeampi
sed '/baz/s/foo/bar/g'                   # tiedostossa tehdään muutokset vain riveillä joissa on jossain paikassa: baz  
sed '/baz/!s/foo/bar/g'                  # tiedostossa tehdään muutokset vain riveillä joissa ei ole jossain paikassa: baz 
sed "s/^ *[0-9]* //g"                    # poista rivinumerot 
awk '{ print FNR " "":"" " $0 }'         # lisää rivinumerot
sed 's/^ *//g;s/ *$//g'                  # Poistaa välilyönnit tiedoston riveiltä edestä ja perästä. Tällätavoin yhdistetään peräkkäiset sed:it.
sed "s/^.//g"                            # poistaa tiedoston jokaiselta riviltä ensimmäisen merkin, mikä se sitten onkin 
sed 's/^[ \t]*//;s/[ \t]*$//'            # poista etu-ja_perä-välilyönti tai tab:it
sed -e '/^$/d'                           # poistaa tiedoston tyhjät rivit  
sed '/^[[:space:]]*$/d'                  # poistaa rivit joilla ei nähtävästi ole mitään, mutta esimerkiksi TAB-beja on
sed '/GUI/d'                             # poistaa kaikki rivit joilla on teksti GUI
sed 's/GUI//g                            # poistaa sanan GUI kaikilta riveiltä
sed -i 6,66d                             # poistaa tiedoston rivit 6-66
sed -e 's/^\(.*\) .*/\1/'                # poistaa viimeisen sanan jokaiselta riviltä 
sed "s/.....$//g"                        # poistaa sanasta viisi  viimeistä merkkiä
sed "s/^.....//g"                        # poistaa sanasta viisi  ensimmäistä merkkiä
sed 's/g.*//g'                           # poistaa lopusta kaikki ensimmäiseen g:hen g mukaanlukien
sed 's/.*g//g'                           # poistaa alusta kaikki ensimmäiseen g:hen g mukaanlukien
sed 's/g.//g'                            # poistaa kaikki g:t ja jokaisen g:n jälkeen seuraavan merkin
sed -i '1,/^$/d'                         # poistaa ensimmäisen kappaleen
sed -n -e '1,/etsittävä ilmaisu/p'       # poista loput rivit löydettyään ilmoitetun lukumäärän etsittyä
sed -e "s/[\t]/,/g"                      # poistaa tabulaattirimerkit
sed "s/^\'//g" | sed "s/\'$//g")         # poistaa heittomerkit sanan alusta ja lopusta (siis merkki: " )
sed '/^xyz/s/abc//g'                     # poistaa abc:n vain riveiltä jotka alkavat xyz
sed '/aaa/,/xxx/s/abc//g' tiedosto       # poista abc siltä riviltä joka alkaa aaa sille riville joka alkaa xxx 
sed 's/..$//'                            # poista jokaiselta riviltä kaksi viimeistä merkkiäsed 's/..$//'
sed -n $'/[^ \t]/,$p'                    # poista alusta rivit jotka ovat tyhjiä tai joilla on vain välilyöntejä ja TAB:eja
{ sed -n '/[^[:space:]]/{p;q}' && cat; } < file     # sama kuin edellinen

sed 's/:/\n/g' <<< $PATH                 # tämä tulostaa käyttöjärjestelmän polut kukin omalle riville  
sed "s:/old/direcory/:/new/directory/:"  # sedissä kenttiä jakamassa käytetään yleensä merkkiä / . Mutta mikä hyvänsän merkki kelpaa. 
sed 's/[![0-9]][0-9]:/"\ "&/g')          # &-merkin kohdalle tulee se tekstijono mikä [![0-9]][0-9]: määräämässä etsinnässä löytyi
sed 's/.*/\"&\"/g'                       # lisää alkuun lainausmerkki ja loppuun myös. 
sed 's/^/     /'                         # lisää alkuun viisi välilyöntiä
sed 's/$/höh/'                           # lisää loppuun höh
sed 's@^.*$@<<<&>>>@g'                   # lisää rivin alkuun <<< ja loppuun >>> . sed-eroitin on @ jotta tiedostonimien / ei vaikuttaisi 
sed  '/kortti/alisätty_rivi'             # lisää rivi jolla lukee: lisätty_rivi jokaisen rivin jälkeen jolla lukee jossain kortti 
sed -i '8i8 tämä on rivi 8'              # lisää rivin 8 jolla lukee: 8 this is line 8. Voi myös lisätä tiedostoon ensimmäisen rivin.
sed "2s/$/ $(sed -n '7p' file)/" file    # lisää tiedoston 7:s rivi tiedoston toisen rivin perään. 
sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1.\2/;ta' # ryhmittele luku malliin: 123.456.789
sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1 \2/;ta' # ryhmittele luku malliin: 123 456 789 
sed -e 's/\(.*\)/\U\1/'                  # tekstijonon muuttaminen suurille kirjaimille: pienille->L
sed 's/\([a-z]*\) \([a-z]*\)/\2 \1/'     # vaihtaa sanat keskenään
sed 's/\([a-z]*\) \1/\1/'                # poistaa toinen kahdesta peräkkäisestä samasta 
sed -r 's/[0-9]+$//g')                   # poistaa numerot sanan lopusta - alussa oleviin se ei koske  
sed -s 's/.*\[\(.*\)\].*/\1/'            # erota teksti rivin viimeisen []-sulkuparin sisältä  
sed 's/\([a-zA-Z0-9[:punct:]]*\)//4'     # poista neljäs sana; 4;sta voi muuttaa ja sanoissa voi olla mitä tahansa  
sed 's/.$//'                             # poistaa viimeisen merkin 
sed 's/ /+/g' tiedosto | bc              # tulostaa rivisummat
sed 'y/abcdefghijklmnopqrstuvwxyzäöå/ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÅ/' # tekstijonon muuttaminen suurille kirjaimille
sed 's:.*-::'                            # tulosta kaikki viimeisestä -merkistä alkaen. Merkin voi valita

sed -n '/PATTERN/p' file                 # sed:illä toteutettu grep ( tai: sed -n 's/pattern/&/p' <file )  
 

sed -e 's/'$(echo "octal-value")'/replace-word/g' # kontrollimerkin poistaminen
sed 's/mikä/miksi/g' tiedosto1 > tiedosto2        # lukee tiedosto1:stä, tekee muutokset ja kirjoittaa tiedosto2:een 
sed 's/^./tekstiä /g'                             # kirjoittaa jokaisen ei-tyhjän rivin alkuun sanan: tekstiä
sed -e '146s/menu/lista/g'                        # tee muutokset rivillä, numero-osoite
sed -e '/Memory/s/test/lista/g'                   # tee muutokset riveillä joilla lukee Memory
sed -e '146,178s/menu/lista/g'                    # tee muutokset alueella
sed 's/\(.\)\1\+/\1/g'                            # supista peräkkäiset samat kirjaimet yhdeksi
cat ~/ohje | sed '/[0-9][0-9]/q'                  # tulosta ensimmäisestä siihen riviin asti jolla on peräkkäin kaksi numeroa
echo "eka toka kolmas" | sed 's/\([[:graph:]]*\).*/\1/'                     # tulostaa eka ja jättää loput sanat pois.
echo "1eka2 toka kolmas" | sed 's/\([[:graph:]]*\) \([[:graph:]]*\)/\2 \1/' # vaihtaa ensimmäisen ja toisen sanan
echo "123 abc" | sed 's/[0-9][0-9]*/& &/'                                   # tulostaa: 123 123 abc
echo abcd123 | sed 's/\([a-z]*\).*/\1/'                                     # tulostaa abcd -> \1 viittaa ensimmäiseen hakuun joten
echo abcd1eeee | sed 's/\([a-z]*\).*/\1/'                                   # tulostaa abcd ja jättää ensimmäisen numeron ja sen jälkeiset pois
echo Poliisi_asema | sed -e 's/^./\U&/' -e 's/_./\U&/g' -e 's/_/ /g'        # tulostaa: Poliisi Asema

 

sed 'H;x;s/^\(.*\)\n\(.*\)/\2\1/'                    # lisää jokaisen rivin loppuun sen edellisen rivin  
  
sed '
/^#/{
h
d
}
G
s/^\(.*\)\n#\(.*\)/\2 \1/'                     # lisää jokaisen rivin eteen kappaleen otsikko    

Haluat listata koneessa pyörivistä prosesseista ne joissa on käytetty jotain tiettyä käskyä. Haluat tulostaa aina ensimmäisen rivin.
Käsky on silloin tämä: ps aux | sed -e '1b' -e '/syslog/!d'
 

sed --in-place 's/^\(.\{20\}\).*/\1/g' file    Replace all lines with only their first 20 characters.


teksti="scale-1.1e-2.2"; apu=$(echo $teksti | grep -Po "\-[[:digit:]]\.[[:digit:]]e\-[[:digit:]]\.[[:digit:]]"); echo $teksti | sed "s/$apu/$(echo $apu |sed 's/e/\*10\^/g')/g"

export PS1="C:\$( pwd | sed 's:/:\\\\\\:g' )\\>" # muuta kehoite "DOS-tyyppiseksi" väliaikaisesti

























































Sed:in komennot:         Mitä_se_tekee
:                        seuraa label 	             
#                        seuraa kommentti
{....}                   joukko yhteeliitettynä
=                        tulosta rivinumero 	    
a \                      liitä perään 	
b label                   - Branch
c \ - change 	
d and D - Delete 	
g and G - Get
h and H - Hold 	
i \ - Insert 	
l - Look
n and N - Next 	
p and P - Print 	
q - Quit
r filename - Read File 	
s/..../..../ - Substitute 	
t label - Test
w filename - Write Filename 	
x - eXchange 	y/..../..../ - Transform



Sed Pattern Flags
/g - Global
/I - Ignore Case
/p - Print
/w filename - Write Filename



Sed Command Line options
-e script (--expression=script)
-f scriptfile (--file=scriptfile)
-h (--help)
-n (--quiet --silent)
-V (--version) 
