Przetwarzanie tekstu za pomocą sed
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ą, żesed
zmieni 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