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.