sed (skrót od stream editor) to edytor strumieniowy, który czyta tekst linia po linii, robi na każdej z nich to, co mu każesz, i wypluwa wynik na standardowe wyjście. Nie otwierasz tu żadnego okna ani interaktywnego trybu jak w vim — podajesz skrypt z poleceniem (najczęściej zamianę wzorca) i puszczasz go na plik albo na to, co przyleci przez potok. Najczęstsze zastosowanie to podmiana tekstu, usuwanie linii, wyciąganie fragmentów po numerze linii albo masowa edycja plików konfiguracyjnych bez otwierania ich ręcznie.
Składnia i najważniejsze opcje
Podstawowa forma to sed [opcje] 'skrypt' [plik...], gdzie najczęstszy skrypt to s/wzorzec/zamiennik/flagi.
-e 'skrypt'— dokłada kolejny fragment skryptu (możesz łączyć wiele-e).-n— wyłącza automatyczne drukowanie każdej linii; przydatne razem z poleceniemp, żeby wypisać tylko to, co Cię interesuje.-i[suffix]— edytuje plik w miejscu; z sufiksem (np.-i.bak) robi kopię zapasową.-E(lub-rw GNU) — włącza rozszerzone wyrażenia regularne, bez ciągłego uciekania nawiasów i+.-f plik— czyta skrypt sed z pliku zamiast z linii poleceń.-s— traktuje każdy plik osobno (GNU), zamiast jednego ciągłego strumienia.-z— rozdziela rekordy znakiem NUL zamiast nowej linii (GNU), pod współpracę zfind -print0.
Przykłady użycia
sed 's/foo/bar/g' plik.txt— zamienia wszystkie wystąpieniafoonabar(bez flagigzmienia tylko pierwsze w linii).sed -i.bak 's/8080/9090/' config.ini— podmienia port w pliku w miejscu i zostawia kopięconfig.ini.bak.sed -n '10,20p' log.txt— wypisuje tylko linie od 10 do 20.sed '/^#/d' config.conf— usuwa linie zaczynające się od#(komentarze).sed -n '/ERROR/p' app.log— wyświetla wyłącznie linie zawierająceERROR, działa jakgrep.
Częste błędy i pułapki
Największa zasadzka to -i między systemami. W GNU sed (Linux) działa sed -i 's/a/b/' plik bez argumentu. W BSD sed (macOS) -i wymaga argumentu z sufiksem kopii, więc musisz napisać sed -i '' 's/a/b/' plik — inaczej dostaniesz dziwny błąd albo plik o nazwie Twojego skryptu. Druga klasyka: w skrypcie s/.../.../ separator / gryzie się ze ścieżkami; gdy podmieniasz ścieżki, użyj innego separatora, np. sed 's#/stary/path#/nowy/path#'. Pamiętaj też, że sed domyślnie używa podstawowych regexów — +, ? i nawiasy grupujące trzeba albo uciekać, albo włączyć -E. I uważaj na -i bez kopii: nadpisujesz oryginał na amen, więc na produkcji najpierw przetestuj bez -i.
Powiązane komendy: awk (gdy potrzebujesz pól i logiki), grep (samo wyszukiwanie), tr (zamiana pojedynczych znaków) oraz cut (wycinanie kolumn).