Zamiana dowolnego ciągu tekstowego na inny w skryptach powłoki shell/bash
Manipulacja tekstem to podstawa automatyzacji w systemach Unix/Linux. Czy chcesz przetwarzać logi, modyfikować pliki konfiguracyjne, czy formatować dane – umiejętność zamiany ciągów tekstowych w Bashu jest niezbędna. W tym przewodniku poznasz wszystkie metody: od podstawowych operacji wbudowanych w powłokę, po zaawansowane techniki z użyciem sed
i awk
. Gotowy, by zostać mistrzem manipulacji tekstem? Zaczynamy!
Dlaczego manipulacja tekstem w Bashu jest tak ważna?
Według badania Stack Overflow Developer Survey 2023, Bash/Shell pozostaje jednym z najczęściej używanych języków wśród administratorów i programistów DevOps. Jego siła tkwi w prostocie i integracji z narzędziami systemowymi. Typowe scenariusze użycia zamiany tekstu to:
- Przetwarzanie plików logów (np. zamiana adresów IP na nazwy domenowe).
- Automatyzacja konfiguracji (modyfikacja plików
.env
czynginx.conf
). - Czyszczenie danych (usuwanie niepotrzebnych znaków, formatowanie CSV).

Metoda 1: Wbudowane możliwości Bashu (parameter expansion)
Bash oferuje wbudowane funkcje do podstawowej zamiany tekstu bez zewnętrznych narzędzi.
Podstawowa zamiana jednego wystąpienia
Składnia:
${zmienna/stary_tekst/nowy_tekst}
Przykład:
tekst="Witaj, Świecie!" echo "${tekst/Świecie/Kosmosie}" # Wynik: Witaj, Kosmosie!
Globalna zamiana wszystkich wystąpień
Dodaj podwójny ukośnik //
:
tekst="jabłko gruszka jabłko" echo "${tekst//jabłko/banan}" # Wynik: banan gruszka banan
Zamiana na początku lub końcu ciągu
- Usuń prefiks:
${zmienna#wzorzec}
sciezka="/home/user/dokument.txt" echo "${sciezka#/home}" # Wynik: /user/dokument.txt
- Usuń sufiks:
${zmienna%wzorzec}
plik="foto.jpg" echo "${plik%.jpg}" # Wynik: foto
Uwaga: Wzorce działają jak w glob
(np. *
oznacza dowolny ciąg).
Metoda 2: Zamiana z użyciem sed
(Stream Editor)
sed
to potężne narzędzie do nieliniowej edycji strumieni tekstowych.
Podstawowa zamiana
Składnia:
sed 's/stary_tekst/nowy_tekst/' plik.txt
Przykład (zamiana „error” na „warning” w całym pliku):
sed 's/error/warning/g' logfile.log
Flagi sed
:
g
– zamień wszystkie wystąpienia w linii.i
– ignoruj wielkość liter (np.s/error/Success/gi
).p
– wypisz zmienione linie.
Zamiana z wyrażeniami regularnymi
Przykład: Zamień wszystkie numery telefonów w formacie XXX-XXX-XXX
na +48 XXX XXX XXX
:
sed -E 's/([0-9]{3})-([0-9]{3})-([0-9]{3})/+48 \1 \2 \3/g' kontakty.txt
Wskazówka: Użyj -i
do modyfikacji pliku w miejscu:
sed -i 's/stary/nowy/g' plik.txt
Metoda 3: Zamiana z użyciem awk
awk
to język do zaawansowanej analizy i przetwarzania tekstu, idealny do pracy z kolumnami.
Zamiana tekstu w kolumnie
Przykład: Zamień „admin” na „root” w trzeciej kolumnie pliku CSV:
awk -F',' 'BEGIN {OFS=","} {gsub(/admin/, "root", $3); print}' users.csv
Warunkowa zamiana tekstu
Zamień „error” na „CRITICAL” tylko w liniach zawierających datę z 2024 roku:
awk '/2024-/ {gsub(/error/, "CRITICAL"); print}' logfile.log
Metoda 4: Zamiana z użyciem tr
(translate)
tr
służy do prostych zamian lub usuwania pojedynczych znaków.
Zamiana małych liter na wielkie
echo "hello world" | tr 'a-z' 'A-Z' # Wynik: HELLO WORLD
Usuwanie znaków specjalnych
echo "Tekst z #hashtagiem!" | tr -d '#!' # Wynik: Tekst z hashtagiem
Case Study: Praktyczne przykłady zamiany tekstu
Scenariusz 1: Masowa zmiana rozszerzeń plików
Zmień wszystkie pliki .txt
na .md
w katalogu:
for plik in *.txt; do mv "$plik" "${plik%.txt}.md" done
Scenariusz 2: Sanityzacja logów
Usuń adresy IP z pliku logów, zastępując je maską [REDACTED]
:
sed -E 's/([0-9]{1,3}\.){3}[0-9]{1,3}/[REDACTED]/g' access.log
Scenariusz 3: Formatowanie danych CSV
Zamień przecinki na średniki w drugiej kolumnie:
awk -F',' 'BEGIN {OFS=","} {gsub(/,/, ";", $2); print}' data.csv
Wskazówki i najlepsze praktyki
- Testuj na kopii pliku – zanim użyjesz
sed -i
lubawk -i inplace
, sprawdź efekt na próbce. - Eskapuj specjalne znaki – np.
sed 's/\//\\\//g'
do zamiany/
na\/
. - Korzystaj z wyrażeń regularnych – np.
\d
dla cyfr (wsed
użyj[0-9]
). - Mierz wydajność – dla dużych plików
awk
jest zwykle szybszy niżsed
.
FAQ: Najczęstsze pytania
Jak zamienić tekst zawierający znaki nowej linii?
Użyj sed
z flagą -z
:
sed -z 's/stary\ntekst/nowy\ntekst/g' plik.txt
Czy można zamieniać tekst w wielu plikach naraz?
Tak, z pętlą for
lub find
:
find . -name "*.log" -exec sed -i 's/error/warning/g' {} +
Jak zamienić tekst tylko w określonych liniach?
W sed
określ zakres linii:
sed '10,20s/stary/nowy/g' plik.txt # Zamiana w liniach 10-20
Podsumowanie
Zamiana ciągów tekstowych w Bashu to kluczowa umiejętność dla każdego, kto pracuje z terminalem. Wybierz metodę w zależności od potrzeb:
- Proste zamiany: Wbudowane funkcje Bashu.
- Zaawansowane wzorce:
sed
z wyrażeniami regularnymi. - Przetwarzanie kolumnowe:
awk
.
Pamiętaj, że praktyka czyni mistrza – eksperymentuj z przykładami i twórz własne skrypty!