Skip to main content

Obsługa komendy sed

Kompletny przewodnik po sed – edytorze strumieniowym tekstu

Co to jest sed?

sed (stream editor) to edytornarzędzie strumieniowy,do któryprzetwarzania przetwarzatekstu tekstna poziomie linii, działające linia po liniilinii. wedługPozwala zdefiniowanychna poleceń.automatyczną Najczęściej używany do automatycznej edycjiedycję plików tekstowych,lub podstawianiastrumieni tekstów, usuwania linii, wstawiania i innych operacjitekstu bez konieczności interaktywnego otwierania pliku.ich w interaktywnym edytorze.

Podstawowa składnia i użyciepolecenia

Typowa konstrukcja polecenia:

sed [opcje] 'polecenie'polecenia' plik.txtplik

GdzieW poleceniu poleceniesed wykonujemy polecenia edycyjne na każdej linii pliku lub strumienia.

Najważniejsze polecenia sed używane w przykładach

  • s/wzorzec/tekst/ – zamiana pierwszego wystąpienia wzorca w linii na podany tekst.
  • s/wzorzec/tekst/g – zamiana wszystkich wystąpień wzorca w linii (opcja g – globalnie).
  • d – usunięcie linii (np. /^#/d usuwa linie zaczynające się od #).
  • p – wyświetlenie linii (często stosowane z opcją -n, by wyświetlić tylko wybrane linie).
  • a – dodanie tekstu po bieżącej linii.
  • i – wstawienie tekstu przed bieżącą linią.

Wyjaśnienie składni zamiany (substytucji) s/// oraz znaków

  • s – instrukcja “substitute” (zamień).
  • Separator w s/// zwykle to znak /, ale może być m.in.dowolny substytucją(np. s/wzorzec/nowy_tekst/#) aby uniknąć uciekania / w zamienianych wzorcach.
  • \' – apostrofy służą do ujęcia polecenia tak, by uniknąć interpretacji przez powłokę.
  • g – oznacza "globalnie", usunięciemczyli zamień wszystkie wystąpienia.
  • d – oznacza "delete", wstawianiem,usuń itp.

    linie pasujące do wzorca.

EscapeObsługa znaków specjalnych

W- escape w sed większość

    znaków
  • \\ ma specjalne znaczenie w wyrażeniach regularnych ibackslash musi być ucieczonapodwójnie znakiem backslashucieczony \\\\ jeśliw ma być traktowana dosłownie:

      poleceniach.
    • . - dowolny znak → dosłownie: \. – kropka oznacza dowolny znak, żeby faktycznie wyszukać kropkę musimy ją uciec.
    • * - zero lub więcej powtórzeń → dosłownie: \*
    • ^, $ - początek/koniec linii → \^, \$
    • [ ] - klasa znaków →, \[ \] – także mają specjalne znaczenie, wymagają escape.
    • /Alternatywnie -możemy zmienić separator → może być zmienionys/old/new/ na inny np. #s#old#new#, lubco ucieczonyułatwia \/
    • pracę
    • \ze - sam backslash → wymaga podwójnego ucieczki \\ścieżkami.

    Podstawowe i rozszerzone przykładyPrzykłady:

    Zamiana tekstu globalna (wszystkie wystąpienia):IP:

    sed 's/stary_tekst/nowy_tekst/192\.168\.1\.1/10.0.0.1/g' plik.txtconf
    

    PodmieniaZamienia wszystkie wystąpienia ciąguadresu stary_tekstIP 192.168.1.1 na nowy_tekst10.0.0.1, wkropki każdej linii pliku.escape'owane.

    Zamiana tylkościeżek wza wybranympomocą zakresieinnego 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 #:separatora:

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

    ywaycie znaku # zamiast / jako separatora,separatora copozwala ułatwiauniknąć podmianyescape'ów w ścieżkach zawierających ukośniki.kach.

    PodwójnyKomentowanie backslashzakresu – ucieczka znaków specjalnych:linii:

    sed 's/\\10,20s/^/\\\\/g'#/' plik.txtconf
    

    PodwajaDodaje znakiznak \# wna tekście.początku linii od 10 do 20.

    DodawanieOdkomentowanie izakresu usuwanie komentarzy w wielu liniach:linii:

    sed '100,150s/10,20s/^#//#/' plik.txtconf
    

    Usuwa znak # dodaje # naz początku linii 100-150od sed10 '100,150s/^#//'do plik.txt # usuwa # na początku linii 100-15020.

    Usuwanie pustych linii:

    sed '/^$/d' plik.txtconf
    

    Usuwa linie całkowicie puste.

    ZamianaPodwajanie wielu spacji/tab na jedną spację:backslash:

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

    Zamienia pojedynczy znak \ na podwójny \\ (używane np. przy generowaniu ścieżek w skryptach).

    UżycieZamiana grupz grupami przechwytywania:

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

    Zamienia tekstwystąpienie "foo bar" na "bar foo", grupy przechwytywaniagdzie \( ... \) przypisująwskazuje fragmentygrupy tekstutekstu, do wzorua \1 i, \2. odwołują się do nich w zamianie.

    ZamianaZaawansowana zamiana adresu IP (z użyciem regexp):regexp:

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

    PodmieniaZamienia dowolny adres IPv4 na 10.0.0.1. Regexp dopasowuje cztery(4 liczby od 0 do 0-999 rozdzielone kropkami.kropkami) na 10.0.0.1.

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

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

    EdytujePodmienia plikwszystkie bezpośrednio,wystąpienia "stary" na "nowy" bez tworzenia kopii zapasowej, ważne dlajest FreeBSD wymaga pustego parametruwymienienie '' po -i.