Obsługa komendy sed
Kompletny przewodnik po sed – edytorze strumieniowym tekstu
sed – edytorze strumieniowym tekstuCo 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 wykonujemy polecenia edycyjne na każdej linii pliku lub strumienia.poleceniesed
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 (opcjag– globalnie).d– usunięcie linii (np./^#/dusuwa 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.dowolnysubstytucją(np.) aby uniknąć uciekanias/wzorzec/nowy_tekst/#/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ść
\\ma–specjalne znaczenie w wyrażeniach regularnych ibackslash musi byćucieczonapodwójnieznakiem backslashucieczony\\\\jeśliwma 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/nainnynp.,#s#old#new#lubcoucieczonyuł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 IP 192.168.1.1 na stary_tekst10.0.0.1, nowy_tekstwkropki każdejsą linii pliku.escape'owane.
Zamiana tylkościeżek wza wybranympomocą zakresieinnego linii:
sed '10,20s/old/new/g' plik.txtPodmienia wszystkie wystąpienia "old" na "new" tylko w liniach 10-20.
Usunięcie komentarzy (linie zaczynające się od #):
sed '/^#/d' plik.txtUsuwa 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
Uż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.