Zamiana ciągów tekstowych w skryptach Bash: Kompleksowy przewodnik
Linux

Zamiana dowolnego ciągu tekstowego na inny w skryptach powłoki shell/bash

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 czy nginx.conf).
  • Czyszczenie danych (usuwanie niepotrzebnych znaków, formatowanie CSV).
Zamiana ciągów tekstowych w skryptach Bash: Kompleksowy przewodnik
Zamiana ciągów tekstowych w skryptach Bash: Kompleksowy przewodnik

Metoda 1: Wbudowane możliwości Bashu (parameter expansion)

Bash oferuje wbudowane funkcje do podstawowej zamiany tekstu bez zewnętrznych narzędzi.

Czytaj  Linux podstawy

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}
    bash
    sciezka="/home/user/dokument.txt"  
    echo "${sciezka#/home}"  # Wynik: /user/dokument.txt  
  • Usuń sufiks: ${zmienna%wzorzec}
    bash
    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:

bash
sed 's/stary_tekst/nowy_tekst/' plik.txt

Przykład (zamiana „error” na „warning” w całym pliku):

bash
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:

bash
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:

bash
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:

bash
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:

bash
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

bash
echo "hello world" | tr 'a-z' 'A-Z'  # Wynik: HELLO WORLD  

Usuwanie znaków specjalnych

bash
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:

bash
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]:

bash
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:

bash
awk -F',' 'BEGIN {OFS=","} {gsub(/,/, ";", $2); print}' data.csv

Wskazówki i najlepsze praktyki

  1. Testuj na kopii pliku – zanim użyjesz sed -i lub awk -i inplace, sprawdź efekt na próbce.
  2. Eskapuj specjalne znaki – np. sed 's/\//\\\//g' do zamiany / na \/.
  3. Korzystaj z wyrażeń regularnych – np. \d dla cyfr (w sed użyj [0-9]).
  4. 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:

bash
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:

bash
find . -name "*.log" -exec sed -i 's/error/warning/g' {} +

Jak zamienić tekst tylko w określonych liniach?

W sed określ zakres linii:

bash
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!

Czytaj  Nadawanie Uprawnień (chmod) Plikom i Katalogom w Linuxie
Polecane wpisy
Ochrona usług na serwerze Linux: Podnoszenie poziomu bezpieczeństwa
Ochrona usług na serwerze Linux: Podnoszenie poziomu bezpieczeństwa

Ochrona usług na serwerze Linux: Podnoszenie poziomu bezpieczeństwa Serwery Linux są jednymi z najczęściej wykorzystywanych platform w środowisku biznesowym i Czytaj dalej

Zaktualizuj oprogramowanie Linux
Zaktualizuj oprogramowanie Linux

Zaktualizuj oprogramowanie Linux Aktualizacje oprogramowania są ważne dla wszystkich systemów operacyjnych, w tym dla systemów Linux. Aktualizacje często zawierają poprawki Czytaj dalej