===== sed - stream editor =====
**Użycie sed w wierszu poleceń:**
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, w których wierszach pliku zostanie ono wykonane.
Przykład:
sed -n '/error/p' logfile.txt
wypisze tylko wiersze zawierające słowo "error" z pliku ''logfile.txt''.
sed '1d' logfile.txt
usunie pierwszy wiersz z pliku ''logfile.txt'' i wypisze pozostałe wiersze na standardowe wyjście.
**Procedura działania sed:**
Sed czyta plik wejściowy wiersz po wierszu i dla każdego wiersza wykonuje określone polecenia. Ogólny przebieg działania sed można opisać następująco:
- Wczytanie wiersza z pliku wejściowego (lub ze standardowego wejścia)
- Wykonanie poleceń na wierszach pasujących do adresu (jeśli został podany)
- Wypisanie zmodyfikowanego wiersza 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 wypisuj automatycznie wierszy (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'' | wypisz pasujące wiersze | ''sed -n '/pattern/p' file '' |
| ''d'' | usuń pasujące wiersze | ''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 | wiersz 1 |
| $ | ostatni wiersz |
| n | wiersz n |
| m,n | wiersze od m do n |
| /pattern/ | wiersz pasujący do wzorca |
| /pattern1/,/pattern2/ | linie od wzorca pattern1 do pattern2 |
| n~m | co m-ty wiersz, począwszy od n |
| 1,$ | wszystkie wiersze |
| 1! | wszystkie wiersze poza pierwszym |
| /pattern/! | wiersze niepasujące do wzorca |
| n,$ | od wiersza n do końca |
| /pattern/,$ | od wiersza pasującego do wzorca do końca |
==== Przykłady użycia ====
Wypisanie pierwszych 10 wierszy pliku:
sed -n '1,10p' file.txt
sed '11,$d' file.txt
sed '10q' file.txt
Wypisanie wierszy 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ę wierszy 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]]