sed

Edytor strumieniowy do filtrowania i przekształcania tekstu (np. zamiana wzorców).

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 poleceniem p, żeby wypisać tylko to, co Cię interesuje.
  • -i[suffix] — edytuje plik w miejscu; z sufiksem (np. -i.bak) robi kopię zapasową.
  • -E (lub -r w 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ę z find -print0.

Przykłady użycia

  • sed 's/foo/bar/g' plik.txt — zamienia wszystkie wystąpienia foo na bar (bez flagi g zmienia 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ące ERROR, działa jak grep.

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).