CodeGym /Kursy /Docker SELF /Przetwarzanie tekstu za pomocą sed

Przetwarzanie tekstu za pomocą sed

Docker SELF
Poziom 8 , Lekcja 1
Dostępny

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ą, że sed 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.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION