1. Składnia polecenia sed
Co to jest sed?
sed (skrót od Stream Editor, czyli edytor strumieniowy) — to potężne narzędzie do przetwarzania tekstu, które pozwala zmieniać, dodawać, usuwać lub transformować linie w plikach tekstowych i strumieniach danych.
Cała magia sed polega na tym, że edytuje tekst "w locie", nie zmieniając oryginalnego pliku (chyba że sam o to poprosisz). Dzięki temu świetnie nadaje się do szybkiego i automatycznego przetwarzania danych.
Podstawowa składnia polecenia
Weźmy podstawowy wzór do pracy z sed:
sed [opcje] 'wzorzec/akcja' plik
Gdzie:
wzorzec— to tekst lub wyrażenie regularne, według którego będzie przeprowadzane wyszukiwanie.akcja— operacja, którą chcesz wykonać (na przykład zamiana tekstu).plik— plik tekstowy zawierający linie, które chcesz zmienić.
Dla uproszczenia na początkowym etapie skupimy się na najpopularniejszych akcjach: zamianie tekstu (s — od słowa "substitute") i usuwaniu linii (d — od słowa "delete").
2. Zamiana tekstu s/stare/nowe/
Przykład 1: Podstawowa zamiana tekstu
Załóżmy, że mamy plik example.txt z następującą zawartością:
Hello world!
Welcome to Linux.
Linux is awesome.
Spróbujmy zamienić słowo "Linux" na sed:
sed 's/Linux/sed/' example.txt
Wynik będzie wyglądał następująco:
Hello world!
Welcome to sed.
sed is awesome.
I to wszystko. Słowo "Linux" zostało zastąpione na sed tylko raz w każdej linii. To jest domyślne zachowanie.
Przykład 2: Globalna zamiana
Jeśli chcesz zastąpić wszystkie wystąpienia słowa zamiast pierwszego w linii, dodaj flagę g (globalnie):
sed 's/Linux/sed/g' example.txt
Jeśli w linii jest kilka wystąpień "Linux", wszystkie zostaną zastąpione na sed.
Przykład 3: Ignorowanie wielkości liter
Aby zamieniać tekst bez uwzględniania wielkości liter, dodaj flagę I (lub i, w zależności od wersji):
sed 's/linux/sed/gi' example.txt
To zastąpi słowa "Linux", "LINUX", "LiNuX" itd.
Przykład 4: Zamiana z zapisaniem wyniku
Domyślnie sed jedynie wyświetla wynik w konsoli, nie zmieniając pliku. Jeśli chcesz zapisać zmiany bezpośrednio w pliku, dodaj opcję -i (in-place):
sed -i 's/Linux/sed/g' example.txt
Teraz plik example.txt zostanie zaktualizowany z nowymi zamianami.
3. Usuwanie linii /wzorzec/d
Przykład 1: Usuwanie linii na podstawie wzorca
Jeśli chcesz usunąć wszystkie linie zawierające słowo "Linux":
sed '/Linux/d' example.txt
Wynik będzie taki:
Hello world!
Tutaj usunięto linie, gdzie znajduje się "Linux".
Usuwanie linii według numeru
Możesz usunąć linię według jej numeru. Na przykład, aby usunąć drugą linię, użyjemy:
sed '2d' example.txt
Wynik:
Hello world!
Linux jest świetny.
Usuwanie kilku linii: podaj zakres, na przykład usunąć linie od 2. do 3.:
sed '2,3d' example.txt
4. Praca z wyrażeniami regularnymi
Tutaj właśnie sed pokazuje swoją moc! W szablonach można używać wyrażeń regularnych do wyszukiwania bardziej złożonych dopasowań.
Przykład 1: Zamiana słów z określonym wzorcem
Załóżmy, że w tekście są linie:
error: coś poszło nie tak
warning: sprawdź swój system
error: nie można połączyć
Chcemy zamienić wszystkie linie zaczynające się od "error" na "Wykryto Problem". Pomogą nam w tym wyrażenia regularne:
sed 's/^error:.*/Wykryto Problem/' logs.txt
Gdzie:
^— wskazuje początek linii..*— oznacza "wszystko, co jest po tym".
Wynik:
Wykryto Problem
warning: sprawdź swój system
Wykryto Problem
5. Wstawianie i dodawanie linii
Wstawianie linii przed dopasowaniem
Aby wstawić linię przed każdą linią zawierającą "Linux":
sed '/Linux/i\# Nauka jest fajna' example.txt
Wynik:
Hello world!
Welcome to Linux.
# Nauka jest fajna
Linux is awesome.
Przykład 2: Dodawanie linii po dopasowaniu
Aby dodać tekst po linii z wzorcem:
sed '/Linux/a\# sed to ułatwia' example.txt
Wynik:
Hello world!
Welcome to Linux.
# sed to ułatwia
Linux is awesome.
# sed to ułatwia
6. Praktyka: przetwarzanie plików konfiguracyjnych
Spróbujmy rozwiązać praktyczne zadanie. Wyobraź sobie, że masz plik konfiguracyjny config.txt:
host=localhost
port=8080
mode=production
logfile=/var/log/app.log
Zadanie 1: Zamienić "localhost" na "127.0.0.1"
sed -i 's/localhost/127.0.0.1/' config.txt
Rezultat:
host=127.0.0.1
port=8080
mode=production
logfile=/var/log/app.log
Zadanie 2: Zwiększyć port o 1
Do tego użyjemy sed z małym trikiem:
sed -i 's/port=8080/port=8081/' config.txt
Rezultat:
host=127.0.0.1
port=8081
mode=production
logfile=/var/log/app.log
Zadanie 3: Usunąć linie z logfile
Jeśli konfiguracja nie wymaga już prowadzenia logów, usuńmy linijkę:
sed -i '/logfile/d' config.txt
Rezultat:
host=127.0.0.1
port=8081
mode=production
7. Kombinacja z innymi poleceniami
sed świetnie działa w połączeniu z innymi narzędziami Linuxa. Na przykład:
grep "error" logs.txt | sed 's/error/ERROR/'
Tu najpierw szukamy linii z błędami, a potem je formatujemy.
Typowe błędy i jak ich unikać
- Błąd: zapomniano o opcji
-i. Nowicjusze często oczekują, żesedzmieni plik, ale zapominają dodać-i. Pamiętaj, aby wyraźnie to określić, jeśli chcesz wprowadzić zmiany w pliku. - Błąd: cudzysłowy. Na niektórych systemach, zwłaszcza jeśli używają pojedynczych cudzysłowów,
\przed znakami specjalnymi może działać niepoprawnie. Zawsze poprawnie maskuj znaki. - Błąd z zakresami linii. Jeśli używasz zakresów (na przykład
2,3d), upewnij się, że zostały poprawnie określone — plik nie może być pusty.
GO TO FULL VERSION