Skip to main content

Obsługa komendy sed

 Co to jest sed?

sed to edytor strumieniowy, który przetwarza tekst linia po linii według zdefiniowanych poleceń. Najczęściej używany do automatycznej edycji plików tekstowych, podstawiania tekstów, usuwania linii, wstawiania i innych operacji bez konieczności interaktywnego otwierania pliku.

Podstawowa składnia i użycie

Typowa konstrukcja polecenia:

sed 'polecenie' plik.txt

Gdzie polecenie może być m.in. substytucją s/wzorzec/nowy_tekst/, usunięciem d, wstawianiem, itp.

Escape znaków specjalnych

W sed większość znaków ma specjalne znaczenie w wyrażeniach regularnych i musi być ucieczona znakiem backslash \ jeśli ma być traktowana dosłownie:

  • . - dowolny znak → dosłownie: \.
  • * - zero lub więcej powtórzeń → dosłownie: \*
  • ^, $ - początek/koniec linii → \^, \$
  • [ ] - klasa znaków → \[ \]
  • / - separator → może być zmieniony na inny np. # lub ucieczony \/
  • \ - sam backslash → wymaga podwójnego ucieczki \\

Podstawowe i rozszerzone przykłady

Zamiana tekstu globalna (wszystkie wystąpienia):

sed 's/stary_tekst/nowy_tekst/g' plik.txt

Podmienia wszystkie wystąpienia ciągu stary_tekst na nowy_tekst w każdej linii pliku.

Zamiana tylko w wybranym zakresie linii:

sed '10,20s/old/new/g' plik.txt

Podmienia wszystkie wystąpienia "old" na "new" tylko w liniach 10-20.

Usunięcie komentarzy (linie zaczynające się od #):

sed '/^#/d' plik.txt

Usuwa linie, które zaczynają się od znaku #.

Zamiana z użyciem alternatywnego separatora / na #:

sed 's#/var/www/html#/srv/www#g' plik.txt

Używa # jako separatora, co ułatwia podmiany w ścieżkach zawierających ukośniki.

Podwójny backslash – ucieczka znaków specjalnych:

sed 's/\\/\\\\/g' plik.txt

Podwaja znaki \ w tekście.

Dodawanie i usuwanie komentarzy w wielu liniach:

sed '100,150s/^/#/' plik.txt    # dodaje # na początku linii 100-150
sed '100,150s/^#//' plik.txt     # usuwa # na początku linii 100-150

Usuwanie pustych linii:

sed '/^$/d' plik.txt

Zamiana wielu spacji/tab na jedną spację:

sed 's/[[:space:]]\+/ /g' plik.txt

Użycie grup przechwytywania:

sed 's/\(foo\) \(bar\)/\2 \1/' plik.txt

Zamienia tekst "foo bar" na "bar foo", grupy przechwytywania \( ... \) przypisują fragmenty tekstu do wzoru \1 i \2.

Zamiana adresu IP (z użyciem regexp):

sed 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/10.0.0.1/g' plik.conf

Podmienia dowolny adres IPv4 na 10.0.0.1. Regexp dopasowuje cztery liczby od 0 do 999 rozdzielone kropkami.

Edycja in-place na FreeBSD (bez tworzenia kopii):

sed -i '' 's/stary/nowy/g' plik.txt

Edytuje plik bezpośrednio, ważne dla FreeBSD wymaga pustego parametru '' po -i.