Polecenie sed: zamiana tekstu, usuwanie wierszy i użycie opcji -i
Polecenie sed to narzędzie Linuksa, które czyta plik wiersz po wierszu i wykonuje zamiany, usuwanie oraz wstawianie, dzięki czemu możesz zmienić wartości w pliku konfiguracyjnym bez otwierania edytora. Po uruchomieniu sed na kopii pliku wp-config.php WordPressa na serwerze AlmaLinux 9 udało się zmienić nazwę bazy danych i zachować oryginał dzięki -i.bak.
Komunikaty o błędach w tym artykule podano dokładnie tak, jak wypisano je przy angielskim locale.
1️⃣ Podstawy polecenia sed i zamiana przez s
Najczęściej używane polecenie s zamienia tekst w formacie [s/szukany tekst/nowy tekst/]. Zamienia tylko pierwsze trafienie w wierszu.
echo 'http://example.com http://example.com/blog' | sed 's/http:/https:/'https://example.com http://example.com/blogAby zamienić wszystkie trafienia w wierszu, dodaj na końcu flagę g.
echo 'http://example.com http://example.com/blog' | sed 's/http:/https:/g'https://example.com https://example.com/blogGdy dopiszesz na końcu nazwę pliku, sed odczyta ten plik i wypisze zmieniony wynik. W kopii pliku wp-config-sample.php WordPressa o nazwie wp-config.php zmieniono wartość DB_USER i sprawdzono tylko ten wiersz przez grep.
sed 's/username_here/wp_user/' wp-config.php | grep DB_USERdefine( 'DB_USER', 'wp_user' );Skoro wartość zmieniła się w danych wyjściowych, łatwo uznać, że zmienił się też plik, ale bez opcji sed wypisuje wynik tylko na ekranie, a oryginalny plik zostawia bez zmian. Po ponownym wyszukaniu tego samego wiersza w pliku nadal była tam początkowa wartość.
grep DB_USER wp-config.phpdefine( 'DB_USER', 'username_here' );Aby zmienić także oryginalny plik, użyj opcji -i z punktu 4️⃣.
2️⃣ Wybieranie wierszy w sed według numeru i wzorca (-n, p)
Bez adresu polecenie s działa na wszystkich wierszach, więc aby zająć się tylko wybranymi, wpisz przed poleceniem numer wiersza lub wzorzec jako adres. -n wyłącza automatyczne wypisywanie, a p wypisuje wybrane wiersze. Razem pokazują tylko wiersz 23.
sed -n '23p' wp-config.phpdefine( 'DB_NAME', 'database_name_here' );Dwa numery wierszy połączone przecinkiem dają ten zakres. Wiersze od 23 do 32 to sekcja z ustawieniami nazwy bazy danych, użytkownika, hasła i hosta.
sed -n '23,32p' wp-config.phpdefine( 'DB_NAME', 'database_name_here' );
/** Database username */
define( 'DB_USER', 'username_here' );
/** Database password */
define( 'DB_PASSWORD', 'password_here' );
/** Database hostname */
define( 'DB_HOST', 'localhost' );Gdy zamiast numeru wiersza wpiszesz wzorzec między ukośnikami, wybrane zostaną wszystkie wiersze z tym wzorcem.
sed -n '/DB_/p' wp-config.phpdefine( 'DB_NAME', 'database_name_here' );
define( 'DB_USER', 'username_here' );
define( 'DB_PASSWORD', 'password_here' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );Polecenie [=] wypisuje numer wybranego wiersza. Adres $ oznacza ostatni wiersz, więc przez [$=] sprawdzisz łączną liczbę wierszy w pliku.
sed -n '/DB_HOST/=' wp-config.php32sed -n '$=' wp-config.php102Adres można też wpisać przed poleceniem s. Poniżej wynik zmiany localhost tylko w wierszu 32 i wypisania samego zmienionego wiersza flagą p.
sed -n '32s/localhost/127.0.0.1/p' wp-config.phpdefine( 'DB_HOST', '127.0.0.1' );Po uruchomieniu p bez -n wybrany wiersz pojawił się jeszcze raz. sed czyta wiersze po jednym do przestrzeni wzorca, wykonuje polecenia, a potem automatycznie wypisuje przestrzeń wzorca, dlatego wiersz 2 wypisany przez p pojawia się ponownie dzięki automatycznemu wypisywaniu.
sed '2p' wp-config.php | head -n 4<?php
/**
/**
* The base configuration for WordPressTakie czytanie i przetwarzanie wiersz po wierszu przypomina taśmę w fabryce, która kładzie części po jednej na stole roboczym, obrabia je i przechodzi do następnej.
Na diagramie poniżej możesz krok po kroku porównać, co każde polecenie wypisuje dla każdego wiersza.
3️⃣ Usuwanie i wstawianie wierszy poleceniem sed (d, i, a)
d usuwa wybrane wiersze. Aby zobaczyć poniższą przykładową konfigurację nginx bez wierszy komentarzy, wybierz wzorcem [^ *#] wiersze zaczynające się od # lub mające przed # same spacje.
cat example.conf# example.com
server {
listen 80;
server_name example.com www.example.com;
# document root
root /var/www/example.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
}sed '/^ *#/d' example.confserver {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
}Po połączeniu poleceń średnikiem usuwany jest też [^$], czyli pusty wiersz. Dwa puste wiersze, które zostały po usunięciu komentarzy, zniknęły i zostały same wiersze konfiguracji.
sed '/^ *#/d; /^$/d' example.confserver {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
}i wstawia tekst przed wybranym wierszem, a a za nim. Wynik wstawienia jednego wiersza komentarza przed wierszem 1 widać poniżej.
sed '1i # managed by sed' example.conf | head -n 3# managed by sed
# example.com
server {Łatwo uznać, że tekst z wcięciem po a zachowa wcięcie, ale GNU sed pomija spacje tuż po a i wstawia sam tekst.
sed '/index index.php/a client_max_body_size 64M;' example.conf# example.com
server {
listen 80;
server_name example.com www.example.com;
# document root
root /var/www/example.com;
index index.php index.html;
client_max_body_size 64M;
location / {
try_files $uri $uri/ /index.php?$args;
}
}Aby zachować wcięcie, dodaj po a ukośnik wsteczny. Wszystko od spacji za ukośnikiem wstecznym trafia do tekstu.
sed '/index index.php/a\ client_max_body_size 64M;' example.conf# example.com
server {
listen 80;
server_name example.com www.example.com;
# document root
root /var/www/example.com;
index index.php index.html;
client_max_body_size 64M;
location / {
try_files $uri $uri/ /index.php?$args;
}
}c zamienia cały wybrany wiersz. Poniżej pierwsze cztery wiersze wyniku zmiany wiersza listen 80 na 8080.
sed '/listen 80;/c\ listen 8080;' example.conf | head -n 4# example.com
server {
listen 8080;
server_name example.com www.example.com;4️⃣ Bezpośrednia edycja plików przez sed -i i nazwa kopii zapasowej
-i zapisuje wynik w oryginalnym pliku zamiast na ekranie. Tekst dopisany tuż po -i trafia na koniec nazwy pliku kopii zapasowej. wp-config.php i inne pliki odczytywane przez witrynę najlepiej edytować z -i.bak, zachowując oryginał.
cp wp-config-sample.php wp-config.phpsed -i.bak 's/database_name_here/wordpress_db/' wp-config.phpZ -i na ekranie nic się nie pojawia, więc sprawdź pliki przez ls -l.
ls -l wp-config.php*-rw-r--r-- 1 root root 3333 Oct 28 15:13 wp-config.php
-rw-r--r-- 1 root root 3339 Oct 28 15:13 wp-config.php.bakObok siebie powstały edytowany plik i plik .bak. Rozmiar zmalał o 6 bajtów, bo database_name_here skróciło się do wordpress_db. Porównanie obu plików przez diff pokazuje tylko zmieniony wiersz.
diff wp-config.php.bak wp-config.php23c23
< define( 'DB_NAME', 'database_name_here' );
---
> define( 'DB_NAME', 'wordpress_db' );Zmieniony wiersz to jeden wiersz DB_NAME w wierszu 23.
Gdy jest kilka wartości do zmiany, połącz skrypty przez -e i uruchom je za jednym razem.
sed -i -e 's/username_here/wp_user/' -e 's/password_here/wp_pass/' wp-config.phpgrep -n -e DB_USER -e DB_PASSWORD wp-config.php26:define( 'DB_USER', 'wp_user' );
29:define( 'DB_PASSWORD', 'wp_pass' );Gdy połączysz -i i -e w [-ie], e zostanie odczytane jako część nazwy kopii i powstał plik wp-config.phpe, jak poniżej.
sed -ie 's/127.0.0.1/localhost/' wp-config.phpls wp-config.php*wp-config.php
wp-config.php.bak
wp-config.phpe-i zapisuje edytowaną treść do nowego pliku, a potem zmienia jego nazwę na oryginalną, więc numer inode pliku różni się przed uruchomieniem i po nim.
ls -i wp-config.php207618887 wp-config.phpsed -i 's/localhost/127.0.0.1/' wp-config.phpls -i wp-config.php207618883 wp-config.phpNumer inode zmienił się z 207618887 przed uruchomieniem na 207618883.
Gdy pliku nie ma lub pominiesz jego nazwę, sed kończy się poniższym błędem i żaden plik się nie zmienia.
sed -i 's/x/y/' no-such.phpsed: can't read no-such.php: No such file or directorysed -i 's/x/y/'sed: no input files5️⃣ Wyrażenia regularne sed, zmiana separatora i opcje
🔲 Wyrażenia regularne i zmiana separatora
Gdy zmieniasz wartość z ukośnikami, np. ścieżkę, separator polecenia s miesza się z ukośnikami w wartości, więc każdy ukośnik w wartości wymaga ukośnika wstecznego.
sed -n 's/\/var\/www\/example.com/\/srv\/www\/example.com/p' example.conf root /srv/www/example.com;Znak tuż po s staje się separatorem, więc po zmianie na |, którego nie ma w wartości, wynik jest taki sam bez ukośników wstecznych.
sed -n 's|/var/www/example.com|/srv/www/example.com|p' example.conf root /srv/www/example.com;Kropka (.) we wzorcu pasuje do dowolnego pojedynczego znaku. Poniżej wynik wzorca szukającego example.com, który zmienił też exampleXcom.
echo 'exampleXcom example.com' | sed 's/example.com/test.org/g'test.org test.orgAby szukać dosłownej kropki, wstaw przed nią ukośnik wsteczny.
echo 'exampleXcom example.com' | sed 's/example\.com/test.org/g'exampleXcom test.orgCzęść w nawiasach przywołasz w nowym tekście przez [\1]. Z -E nawiasów i + używa się bez ukośników wstecznych. Poniżej wynik z zachowaniem liczby po listen i dopisaniem default_server.
sed -nE 's/listen ([0-9]+);/listen \1 default_server;/p' example.conf listen 80 default_server;Bez -E ten sam skrypt czyta nawiasy jako tekst i pojawia się błąd, że nie ma grupy do przywołania. Bez -E nawiasy i + wymagają ukośnika wstecznego.
sed -n 's/listen ([0-9]+);/listen \1 default_server;/p' example.confsed: -e expression #1, char 46: invalid reference \1 on `s' command's RHSsed -n 's/listen \([0-9]\+\);/listen \1 default_server;/p' example.conf listen 80 default_server;[&] w nowym tekście oznacza cały tekst dopasowany do wzorca, więc możesz dodać # przed dopasowaną częścią i zmienić wiersz w komentarz.
sed -n 's/server_name .*;/# &/p' example.conf # server_name example.com www.example.com;🔲 Opcje polecenia sed
📌 Główne opcje: wyniki z tego artykułu
| Opcja | Zadanie | Wynik w tym artykule | |
|---|---|---|---|
| -n | Wyłącza automatyczne wypisywanie i wypisuje tylko wiersze wybrane przez p | sed -n '23p' pokazuje tylko wiersz 23; bez -n 2p wypisuje wiersz 2 dwa razy | |
| -i | Zapisuje wynik w oryginalnym pliku zamiast na ekranie (tekst tuż po opcji trafia na koniec nazwy kopii) | -i.bak tworzy wp-config.php.bak; po uruchomieniu zmienia się numer inode | |
| -e | Łączy kilka skryptów i uruchamia je za jednym razem | DB_USER i DB_PASSWORD zmieniają się naraz; połączone jako -ie tworzą kopię wp-config.phpe | |
| -E | Używa rozszerzonych wyrażeń regularnych (bez ukośnika wstecznego przy nawiasach i +) | Wypisuje listen 80 default_server;; ten sam skrypt bez -E daje błąd [invalid reference] | |
| --follow-symlinks | Razem z -i edytuje oryginalny plik, na który wskazuje dowiązanie | Bez niej w miejscu dowiązania powstaje zwykły plik, a oryginał się nie zmienia; z nią zmienia się oryginalna wartość |
📎 Pozostałe opcje: według oficjalnego podręcznika
| Opcja | Zadanie | |
|---|---|---|
| -f | Czyta skrypt z pliku i go wykonuje | |
| -r | Rozszerzone wyrażenia regularne, jak -E (bardziej przenośne jest -E) | |
| -s | Traktuje każdy plik osobno zamiast jako jeden ciągły strumień | |
| -z | Dzieli wiersze znakiem null zamiast znaku nowego wiersza | |
| -u | Czyta wejście mniejszymi porcjami i częściej opróżnia wyjście | |
| --posix | Wyłącza wszystkie rozszerzenia GNU | |
| --debug | Wypisuje przebieg wykonania w rozwiniętej postaci |
🔲 Symulator polecenia sed
W folderze roboczym symulatora poniżej są kopia wp-config.php i example.conf. Możesz samodzielnie wpisać dotychczasowe polecenia, a pliki zmienione przez -i sprawdzić przez ls -l i diff.
🔢 FAQ & polecane treści







ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.