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:
-idirektno menja fajl bez potvrde. Pre nego što je koristite, testirajte komandu bez-ida 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.