===== sed - stream editor =====
**Użycie sed w linii komend:**
sed 'polecenia' plik
cat plik | sed 'polecenia'
sed -e 'polecenia_1' -e 'polecenia_2'
Każde polecenie sed może być poprzedzone adresem (lub adresami) określającymi, na których liniach pliku polecenie ma być wykonane.
Przykład:
sed -n '/error/p' logfile.txt
wydrukuje tylko linie zawierające słowo "error" z pliku ''logfile.txt''.
sed '1d' logfile.txt
usunie pierwszą linię z pliku ''logfile.txt'' i wydrukuje pozostałe linie na standardowe wyjście.
**Procedura działania sed:**
Sed czyta plik wejściowy linia po linii i dla każdej linii wykonuje określone polecenia. Ogólny przebieg działania sed można opisać następująco:
- Wczytanie linii z pliku wejściowego (lub standardowego wejścia)
- Wykonanie poleceń na liniach dopasowanych w adresie (jeśli podano)
- Wydrukowanie zmodyfikowanej linii na standardowe wyjście (chyba że użyto opcji ''-n'')
{{zajecia:so_2025_2:lab:sed.png?500|Procedura działania sed}}
**Najważniejsze opcje:**
^ Opcja ^ Opis ^
| ''-n'' | nie drukuj automatycznie linii (używane z poleceniem ''p'') |
| ''-e'' | pozwala na wykonanie wielu poleceń sed |
| ''-i'' | edytuj plik "na miejscu" (in-place) |
| ''-E'' | użyj rozszerzonych wyrażeń regularnych (ERE) |
==== Podstawowe polecenia sed ====
^ Polecenie ^ Opis ^ Przykład ^
| ''p'' | wydrukuj linie pasujące | ''sed -n '/pattern/p' file '' |
| ''d'' | usuń linie pasujące | ''sed '/pattern/d' file '' |
| ''s/old/new/'' | zamień ''old'' na ''new'' | ''sed 's/old/new/' file '' |
| ''s/old/new/g'' | zamień wszystkie wystąpienia | ''sed 's/old/new/g' file '' |
| ''i\ tekst'' | wstaw tekst przed linią pasującą | ''sed '/pattern/i\ tekst' file '' |
| ''a\ tekst'' | dołącz tekst po linii pasującej | ''sed '/pattern/a\ tekst' file '' |
| ''c\ tekst'' | zamień linię pasującą na tekst | ''sed '/pattern/c\ tekst' file '' |
| ''y/abc/xyz/'' | transliteracja znaków | | ''sed 'y/abc/xyz/' file '' |
| ''q'' | zakończ przetwarzanie po linii pasującej | ''sed '/pattern/q' file '' |
| ''= '' | wydrukuj numer linii | ''sed -n '/pattern/=' file '' |
==== Adresy ====
^ Adres ^ Znaczenie ^
| 1 | linia 1 |
| $ | ostatnia linia |
| n | linia n |
| m,n | linie od m do n |
| /pattern/ | linia pasująca do wzorca |
| /pattern1/,/pattern2/ | linie od wzorca pattern1 do pattern2 |
| n~m | co m-ta linia, zaczynając od n |
| % | wszystkie linie |
| 1! | wszystkie linie poza 1 |
| /pattern/! | linie niepasujące do wzorca |
| n,$ | od linii n do końca |
| /pattern/,$ | od linii pasującej do wzorca do końca |
==== Przykłady użycia ====
Wypisanie pierwszych 10 linii pliku:
sed -n '1,10p' file.txt
sed '10,$d' file.txt
sed '10q' file.txt
Wypisanie linii zawierających "error":
sed -n '/error/p' logfile.txt
Usunięcie pustych linii z pliku:
sed '/^$/d' file.txt
Zamiana "foo" na "bar" w pliku:
sed 's/foo/bar/g' file.txt
Zamiana małych liter na wielkie:
sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' file.txt
Zamiana z odniesieniem do znalezionego wzorca:
sed -E 's/error_[0-9]+/[&]/g' logfile.txt
(dodaje nawiasy kwadratowe wokół dopasowanego wyrażenia
Zamiana z odniesieniem do grup:
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/g' file.txt
(zamienia daty z formatu RRRR-MM-DD na DD/MM/RRRR)
Wypisz liczbę linii w pliku:
sed -n '$=' file.txt
==== Zasoby online ====
* [[https://www.grymoire.com/Unix/Sed.html|Sed - An Introduction and Tutorial]] by Bruce Barnett
* [[https://www.gnu.org/software/sed/manual/sed.html|GNU sed Manual]]
* [[https://sed.js.org/|sed.js - An online sed editor and sandbox]]
* [[https://www.geeksforgeeks.org/sed-command-in-linux-unix-with-examples/|Sed Command in Linux/Unix with Examples - GeeksforGeeks]]