Polecenie sed: zamiana tekstu, usuwanie wierszy i użycie opcji -i

Środowisko testoweRodzina RHELAlmaLinux 9.8konto rootSprawdzono 2026-10-28

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/blog

Aby 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/blog

Gdy 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_USER
define( '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.php
define( '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.php
define( '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.php
define( '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.php
define( '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.php
32
sed -n '$=' wp-config.php
102

Adres 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.php
define( '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 WordPress

Takie 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.

🧭 Przestrzeń wzorca sed i automatyczne wypisywanie: p i d w wierszu 2
Diagram objaśniający
⚙️ Polecenie
$ sed '2p'-n '2p''2d' wp-config.php
Odczytany wierszWykonanie polecenia i dane wyjściowe
Wiersz 1 → przestrzeń wzorca<?php
➜
Inny niż adres 2: brak poleceniaAutomatyczne wypisanie 1 razBrak danych wyjściowych przez -n
Wiersz 2 → przestrzeń wzorca/**
➜
Zgodny z adresem 2: wykonanie pZgodny z adresem 2: wykonanie d1 raz przez p + 1 raz automatycznieTylko 1 raz przez pCzyści przestrzeń wzorca i przechodzi do następnego wiersza
Wiersz 3 → przestrzeń wzorca * The base configuration for WordPress
➜
Inny niż adres 2: brak poleceniaAutomatyczne wypisanie 1 razBrak danych wyjściowych przez -n
🖥️ Co pojawia się na ekranie (wiersze 1~3)
<?php/**/** * The base configuration for WordPress
p wypisuje przestrzeń wzorca jeszcze raz, więc bez -n wiersz 2 pojawia się dwa razy.
-n wyłącza automatyczne wypisywanie, więc tylko wiersz 2 wybrany przez p pojawia się jeden raz.
d czyści przestrzeń wzorca i przechodzi do następnego wiersza, więc wiersz 2 nie jest wypisywany automatycznie.

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.conf
server {
    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.conf
server {
    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.php
sed -i.bak 's/database_name_here/wordpress_db/' wp-config.php

Z -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.bak

Obok 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.php
23c23
< 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.php
grep -n -e DB_USER -e DB_PASSWORD wp-config.php
26: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.php
ls 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.php
207618887 wp-config.php
sed -i 's/localhost/127.0.0.1/' wp-config.php
ls -i wp-config.php
207618883 wp-config.php

Numer 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.php
sed: can't read no-such.php: No such file or directory
sed -i 's/x/y/'
sed: no input files

5️⃣ 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.org

Aby szukać dosłownej kropki, wstaw przed nią ukośnik wsteczny.

echo 'exampleXcom example.com' | sed 's/example\.com/test.org/g'
exampleXcom test.org

Część 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.conf
sed: -e expression #1, char 46: invalid reference \1 on `s' command's RHS
sed -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

OpcjaZadanieWynik w tym artykule
-nWyłącza automatyczne wypisywanie i wypisuje tylko wiersze wybrane przez psed -n '23p' pokazuje tylko wiersz 23; bez -n 2p wypisuje wiersz 2 dwa razy
-iZapisuje 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 razemDB_USER i DB_PASSWORD zmieniają się naraz; połączone jako -ie tworzą kopię wp-config.phpe
-EUż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-symlinksRazem z -i edytuje oryginalny plik, na który wskazuje dowiązanieBez 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

OpcjaZadanie
-fCzyta skrypt z pliku i go wykonuje
-rRozszerzone wyrażenia regularne, jak -E (bardziej przenośne jest -E)
-sTraktuje każdy plik osobno zamiast jako jeden ciągły strumień
-zDzieli wiersze znakiem null zamiast znaku nowego wiersza
-uCzyta wejście mniejszymi porcjami i częściej opróżnia wyjście
--posixWyłącza wszystkie rozszerzenia GNU
--debugWypisuje 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.

Symulator polecenia sedGNU sed
[root@server work]#
Klawiszami ↑↓ przywołasz wcześniej wpisane polecenia.

🔢 FAQ & polecane treści

Plik wp-config-sample.php WordPressa ma końce wierszy CRLF, więc tuż przed końcem wiersza jest niewidoczny [\r]. [/false );$/] nie wypisał żadnego wiersza, a w kopii z [\r] usuniętym przez [s/\r$//] ten sam wzorzec znalazł wiersz WP_DEBUG.

-i tworzy w miejscu dowiązania nowy zwykły plik i tam zapisuje, więc oryginał, na który wskazywało dowiązanie, się nie zmienił. Aby edytować oryginalny plik, podaj też [--follow-symlinks]. Wtedy dowiązanie zostało, a oryginalna wartość się zmieniła.

Nawet zmiennej ustawionej przez NEW=wp_user powłoka nie rozwija w pojedynczych cudzysłowach, więc [$NEW] trafia tam dosłownie. Gdy skrypt ujęto w podwójne cudzysłowy, powłoka najpierw rozwinęła zmienną i w miejscu [$NEW] pojawiło się wp_user.

🧭 Polecane treści o poleceniach tekstowych 9 wpisów · 2 źródła
🗂️ Polecenia do przeglądania · edycji tekstu
📄 Polecenie grep 📄 Polecenie sort 📄 Polecenie uniq 📄 Polecenie tee 📄 Polecenie sed
📄 Polecenie cat 📄 Polecenie less 📄 Polecenia head · tail 📄 Polecenia vi · vim

ℹ️ 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 10   +   4   =