Gym
lesson

Osnove sed-a

Cilj lekcije: Razumeti kako sed obrađuje tekst liniju po liniju i naučiti najvažnije operacije: zamenu teksta, brisanje linija i izmenu fajlova direktno na disku.


Šta je sed?

sed (Stream EDitor) je alat koji čita tekst liniju po liniju, primenjuje zadatu operaciju i ispisuje rezultat. Za razliku od editora poput nano ili vim, sed ne otvara fajl — samo prima tekst kao "tok" (stream), transformiše svaku liniju i ispisuje rezultat. Ne menja originalni fajl ukoliko to eksplicitno ne zatražiš preko opcije -i.

Osnovna sintaksa:

sed 'OPERACIJA' fajl.txt
# ili iz pipeline-a:
cat fajl.txt | sed 'OPERACIJA'

Zamena teksta — operacija s

Najčešće korišćena operacija u sed-u je zamena (substitute):

sed 's/staro/novo/' fajl.txt

Format: s/obrazac/zamena/zastavice

Zamena prvog pojavljivanja u svakoj liniji

echo "Linux je dobar, Linux je moćan" | sed 's/Linux/GNU\/Linux/'
# Izlaz: GNU/Linux je dobar, Linux je moćan

Primetite da je zamenjen samo prvi Linux u liniji.

Globalna zamena — zastavica g

echo "Linux je dobar, Linux je moćan" | sed 's/Linux/GNU\/Linux/g'
# Izlaz: GNU/Linux je dobar, GNU/Linux je moćan

Zastavica g (global) zamenjuje sva pojavljivanja u svakoj liniji.

Ignorisanje veličine slova — zastavica I

echo "linux LINUX Linux" | sed 's/linux/sistem/gI'
# Izlaz: sistem sistem sistem

Upotreba različitih graničnika

Kada obrazac ili zamena sadrže /, sed se zbuni — kao razdvajač interno koristi /, pa moraš svaki / u tekstu da "zaštitiš" sa \. Brže je jednostavno izabrati drugi karakter kao razdvajač (npr. | ili #):

# Zamena putanje — bez graničnika problem:
sed 's/\/home\/student\//\/home\/user\//g' fajl.txt

# Sa alternativnim graničnikom (|):
sed 's|/home/student/|/home/user/|g' fajl.txt

Praktični primer: zamena IP adrese u konfiguraciji

# Stara IP adresa: 192.168.1.100, nova: 10.0.0.50
sed 's/192\.168\.1\.100/10.0.0.50/g' nginx.conf

Napomena: Tačka (.) u regularnim izrazima znači "bilo koji karakter". Da biste tražili bukvalno tačku, koristite \..


Izmena fajla direktno — opcija -i

Do sada smo samo prikazivali izmenjeni tekst. Da biste izmenili originalni fajl, koristite -i:

sed -i 's/192\.168\.1\.100/10.0.0.50/g' nginx.conf

Upozorenje: -i direktno menja fajl bez potvrde. Pre nego što je koristite, testirajte komandu bez -i da biste videli šta će biti izmenjeno.

Pravljenje backup kopije pre izmene

# Kreira nginx.conf.bak pre izmene
sed -i.bak 's/192\.168\.1\.100/10.0.0.50/g' nginx.conf

Sufiks koji navedete (.bak) dodaje se originalnom imenu fajla kao backup.


Brisanje linija — operacija d

Brisanje N-te linije

# Briši prvu liniju (npr. zaglavlje CSV fajla)
sed '1d' podaci.csv

# Briši petu liniju
sed '5d' fajl.txt

Brisanje opsega linija

# Briši linije od 3 do 7
sed '3,7d' fajl.txt

# Briši od linije 2 do kraja fajla
sed '2,$d' fajl.txt

Brisanje linija koje sadrže obrazac

# Briši sve linije koje sadrže "TODO"
sed '/TODO/d' zadaci.txt

# Briši komentare (linije koje počinju sa #)
sed '/^#/d' config.txt

# Briši prazne linije
sed '/^$/d' fajl.txt

Praktični primer: uklanjanje komentara iz konfiguracionog fajla

# Ukloni komentare i prazne linije, prikaži samo aktivne opcije
sed -e '/^#/d' -e '/^$/d' /etc/ssh/sshd_config

Opcija -e omogućava navođenje više operacija u jednoj komandi.


Prikaz određene linije — operacija p sa -n

Opcija -n potiskuje podrazumevani ispis; p eksplicitno ispisuje liniju:

# Ispiši samo petu liniju
sed -n '5p' fajl.txt

# Ispiši linije od 10 do 20
sed -n '10,20p' fajl.txt

# Ispiši linije koje sadrže "ERROR"
sed -n '/ERROR/p' app.log

Dodavanje i umetanje linija

Dodavanje linije posle određene linije — operacija a

# Dodaj liniju posle svake linije koja sadrži "server_name"
sed '/server_name/a\    listen 443 ssl;' nginx.conf

Umetanje linije pre određene linije — operacija i

# Umetni komentar pre prve linije
sed '1i\# Automatski generisano — ne menjati ručno' config.txt

Kombinovanje operacija sa -e

# Više izmena odjednom
sed -e 's/http:/https:/g' \
    -e 's/port 80/port 443/g' \
    -e '/^#/d' \
    nginx.conf

Praktični primeri

Primer 1: Ekstrakcija bloka između dve linije

# Ispiši sve između "START" i "END"
sed -n '/START/,/END/p' fajl.txt

Primer 2: Uklanjanje razmaka na kraju linije (trailing whitespace)

sed 's/[[:space:]]*$//' fajl.txt

Primer 3: Zamena prazne linije separatorom

sed 's/^$/---/' dokument.txt

Regularni izrazi u sed-u

sed podržava osnove regularnih izraza (BRE = Basic Regular Expression). Za naprednije obrasce koristi -E koji uključuje ERE (Extended Regular Expression) — operatore +, ?, (, | direktno bez kosih crta. Najvažniji metakarakteri:

Simbol Značenje Primer
. Bilo koji karakter s/a.c/X/
* Nula ili više prethodnih s/ab*/X/
^ Početak linije s/^#//
$ Kraj linije s/ *$//
[abc] Jedan od karaktera s/[aeiou]/*/g
[^abc] Ni jedan od karaktera s/[^0-9]//g
\+ Jedan ili više (ERE sa -E) sed -E 's/[0-9]+/N/g'
\( \) Grupovanje s/\(foo\)bar/\1baz/

Za proširene regularne izraze koristite sed -E:

# Ukloni sve HTML tagove
sed -E 's/<[^>]+>//g' stranica.html

# Izvuci samo IP adrese (pojednostavljen obrazac)
sed -n -E 's/.*([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*/\1/p' log.txt

Rezime

Komanda Šta radi
sed 's/a/b/' Zameni prvo pojavljivanje a sa b u svakoj liniji
sed 's/a/b/g' Zameni sva pojavljivanja a sa b
sed -i 's/a/b/g' fajl Izmeni fajl direktno
sed -i.bak 's/a/b/g' fajl Izmeni fajl i napravi backup
sed 'Nd' Briši N-tu liniju
sed '/obrazac/d' Briši linije koje sadrže obrazac
sed '/^#/d' Briši komentare
sed '/^$/d' Briši prazne linije
sed -n 'Np' Ispiši samo N-tu liniju
sed -n '/obrazac/p' Ispiši linije koje sadrže obrazac
sed -e 'op1' -e 'op2' Više operacija odjednom

U sledećoj lekciji ćemo naučiti awk — alat koji ide korak dalje i omogućava pravo programiranje pri obradi strukturiranih podataka.