sed-commando: tekst vervangen, regels verwijderen en de optie -i gebruiken
Het sed-commando is een Linux-tool die een bestand regel voor regel leest en vervangingen, verwijderingen en invoegingen uitvoert, zodat je waarden in een configuratiebestand kunt wijzigen zonder een editor te openen. Toen we sed op een AlmaLinux 9-server uitvoerden op een kopie van WordPress' wp-config.php, konden we de databasenaam wijzigen en met -i.bak het origineel bewaren.
De foutmeldingen in dit artikel staan er letterlijk zoals ze onder een Engelse locale zijn uitgevoerd.
1️⃣ Basisgebruik van het sed-commando en vervangen met s
Het meestgebruikte commando s vervangt tekst in de vorm [s/zoektekst/nieuwe tekst/]. Het vervangt op een regel alleen de eerste treffer.
echo 'http://example.com http://example.com/blog' | sed 's/http:/https:/'https://example.com http://example.com/blogOm alle treffers op een regel te vervangen, zet je de vlag g aan het eind.
echo 'http://example.com http://example.com/blog' | sed 's/http:/https:/g'https://example.com https://example.com/blogZet je een bestandsnaam erachter, dan leest sed dat bestand en toont het gewijzigde resultaat. In een kopie van WordPress' wp-config-sample.php met de naam wp-config.php hebben we de waarde van DB_USER gewijzigd en alleen die regel met grep gecontroleerd.
sed 's/username_here/wp_user/' wp-config.php | grep DB_USERdefine( 'DB_USER', 'wp_user' );Omdat de waarde in de uitvoer is veranderd, denk je al snel dat het bestand ook is veranderd, maar zonder opties toont sed het resultaat alleen op het scherm en laat het het oorspronkelijke bestand ongemoeid. Toen we dezelfde regel opnieuw in het bestand zochten, stond de eerste waarde er nog.
grep DB_USER wp-config.phpdefine( 'DB_USER', 'username_here' );Om ook het oorspronkelijke bestand te wijzigen, gebruik je de optie -i uit 4️⃣.
2️⃣ Regels kiezen in sed op regelnummer en patroon (-n, p)
Zonder adres geldt het commando s voor alle regels. Voor bepaalde regels zet je daarom een regelnummer of patroon als adres vóór het commando. -n schakelt de automatische uitvoer uit en p toont de gekozen regels. Samen tonen ze alleen regel 23.
sed -n '23p' wp-config.phpdefine( 'DB_NAME', 'database_name_here' );Verbind je twee regelnummers met een komma, dan verschijnt dat bereik. Regels 23 tot en met 32 vormen het deel met de instellingen voor databasenaam, gebruiker, wachtwoord en host.
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' );Zet je in plaats van een regelnummer een patroon tussen slashes, dan worden alle regels met dat patroon gekozen.
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', '' );Het commando [=] toont het nummer van de gekozen regel. Het adres $ betekent de laatste regel, dus met [$=] zie je het totale aantal regels in het bestand.
sed -n '/DB_HOST/=' wp-config.php32sed -n '$=' wp-config.php102Een adres kan ook vóór het commando s staan. Hieronder staat het resultaat als localhost alleen op regel 32 wordt gewijzigd en met de vlag p alleen de gewijzigde regel wordt getoond.
sed -n '32s/localhost/127.0.0.1/p' wp-config.phpdefine( 'DB_HOST', '127.0.0.1' );Toen we p zonder -n uitvoerden, verscheen de gekozen regel nog een keer. sed leest regels één voor één in de patroonruimte, voert de commando's uit en toont daarna automatisch de patroonruimte. Zo komt regel 2, die p al toonde, via de automatische uitvoer nog eens voorbij.
sed '2p' wp-config.php | head -n 4<?php
/**
/**
* The base configuration for WordPressDeze werkwijze, regel voor regel lezen en verwerken, lijkt op een lopende band in een fabriek die onderdelen één voor één op de werkbank legt, bewerkt en doorgaat naar het volgende onderdeel.
Wat elk commando per regel toont, kun je stap voor stap vergelijken in het diagram hieronder.
3️⃣ Regels verwijderen en invoegen met het sed-commando (d, i, a)
d verwijdert de gekozen regels. Om het nginx-voorbeeld hieronder zonder commentaarregels te zien, kies je met het patroon [^ *#] de regels die met # beginnen of alleen spaties vóór # hebben.
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;
}
}Verbind je commando's met een puntkomma, dan wordt ook [^$] verwijderd, wat een lege regel betekent. De twee lege regels die na het verwijderen van het commentaar over waren, verdwenen en alleen de configuratieregels bleven staan.
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 voegt tekst in vóór de gekozen regel, a erna. Het resultaat van één commentaarregel vóór regel 1 zie je hieronder.
sed '1i # managed by sed' example.conf | head -n 3# managed by sed
# example.com
server {Je denkt al snel dat ingesprongen tekst na a de inspringing behoudt, maar GNU sed slaat de spaties direct na a over en voegt alleen de tekst in.
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;
}
}Om de inspringing te behouden, zet je een backslash na a. Vanaf de spatie achter de backslash telt alles als 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;
}
}c vervangt de gekozen regel in zijn geheel. Hieronder staan de eerste vier regels van het resultaat als de regel listen 80 in 8080 wordt gewijzigd.
sed '/listen 80;/c\ listen 8080;' example.conf | head -n 4# example.com
server {
listen 8080;
server_name example.com www.example.com;4️⃣ Bestanden rechtstreeks bewerken met sed -i en namen van back-ups
-i slaat het resultaat op in het oorspronkelijke bestand in plaats van het op het scherm te tonen. Tekst direct na -i komt aan het eind van de back-upbestandsnaam. wp-config.php en andere bestanden die de site leest, bewerk je het best met -i.bak, zodat het origineel bewaard blijft.
cp wp-config-sample.php wp-config.phpsed -i.bak 's/database_name_here/wordpress_db/' wp-config.phpMet -i verschijnt er niets op het scherm, dus controleer de bestanden met 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.bakHet bewerkte bestand en een .bak-bestand staan nu naast elkaar. Het bestand is 6 bytes kleiner omdat database_name_here is ingekort tot wordpress_db. Vergelijk je de twee bestanden met diff, dan zie je alleen de gewijzigde regel.
diff wp-config.php.bak wp-config.php23c23
< define( 'DB_NAME', 'database_name_here' );
---
> define( 'DB_NAME', 'wordpress_db' );De gewijzigde regel is de ene DB_NAME-regel op regel 23.
Heb je meerdere waarden te wijzigen, koppel dan scripts met -e en voer ze in één keer uit.
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' );Schrijf je -i en -e aaneen als [-ie], dan wordt de e gelezen als deel van de back-upnaam en ontstond er, zoals hieronder, een bestand wp-config.phpe.
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 schrijft de bewerkte inhoud naar een nieuw bestand en hernoemt dat naar de oorspronkelijke naam, dus het inode-nummer van het bestand verschilt vóór en na de uitvoering.
ls -i wp-config.php207618887 wp-config.phpsed -i 's/localhost/127.0.0.1/' wp-config.phpls -i wp-config.php207618883 wp-config.phpHet inode-nummer ging van 207618887 vóór de uitvoering naar 207618883.
Bestaat het bestand niet of vergeet je de bestandsnaam, dan eindigt sed met de fout hieronder en verandert er geen enkel bestand.
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️⃣ Reguliere expressies in sed, scheidingsteken wijzigen en opties
🔲 Reguliere expressies en scheidingsteken wijzigen
Wijzig je een waarde met slashes, zoals een pad, dan raken het scheidingsteken van s en de slashes in de waarde vermengd. Elke slash in de waarde heeft dan een backslash nodig.
sed -n 's/\/var\/www\/example.com/\/srv\/www\/example.com/p' example.conf root /srv/www/example.com;Het teken direct na s wordt het scheidingsteken, dus als je overstapt op |, dat niet in de waarde voorkomt, krijg je hetzelfde resultaat zonder backslashes.
sed -n 's|/var/www/example.com|/srv/www/example.com|p' example.conf root /srv/www/example.com;Een punt (.) in een patroon staat voor één willekeurig teken. Hieronder staat het resultaat van een patroon voor example.com dat ook exampleXcom heeft gewijzigd.
echo 'exampleXcom example.com' | sed 's/example.com/test.org/g'test.org test.orgOm een letterlijke punt te zoeken, zet je er een backslash voor.
echo 'exampleXcom example.com' | sed 's/example\.com/test.org/g'exampleXcom test.orgEen deel tussen haakjes roep je in de nieuwe tekst terug met [\1]. Met -E gebruik je haakjes en + zonder backslashes. Hieronder staat het resultaat waarbij het getal na listen blijft staan en default_server wordt toegevoegd.
sed -nE 's/listen ([0-9]+);/listen \1 default_server;/p' example.conf listen 80 default_server;Zonder -E leest hetzelfde script de haakjes als tekst en krijg je een fout dat er geen groep is om terug te roepen. Zonder -E hebben haakjes en + een backslash nodig.
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;[&] in de nieuwe tekst staat voor alle tekst die met het patroon overeenkwam, dus je kunt # voor de treffer zetten en de regel tot commentaar maken.
sed -n 's/server_name .*;/# &/p' example.conf # server_name example.com www.example.com;🔲 Opties van het sed-commando
📌 Belangrijkste opties: resultaten uit dit artikel
| Optie | Taak | Resultaat in dit artikel | |
|---|---|---|---|
| -n | Schakelt de automatische uitvoer uit en toont alleen met p gekozen regels | sed -n '23p' toont alleen regel 23; zonder -n toont 2p regel 2 twee keer | |
| -i | Slaat het resultaat op in het oorspronkelijke bestand in plaats van op het scherm (tekst direct erna komt aan het eind van de back-upnaam) | -i.bak maakt wp-config.php.bak; het inode-nummer verandert na de uitvoering | |
| -e | Koppelt meerdere scripts en voert ze in één keer uit | DB_USER en DB_PASSWORD veranderen in één keer; aaneengeschreven als -ie ontstaat een back-up wp-config.phpe | |
| -E | Gebruikt uitgebreide reguliere expressies (zonder backslash bij haakjes en +) | Toont listen 80 default_server;; hetzelfde script zonder -E geeft de fout [invalid reference] | |
| --follow-symlinks | Bewerkt samen met -i het oorspronkelijke bestand waarnaar de koppeling wijst | Zonder de optie komt er een gewoon bestand op de plek van de koppeling en blijft het origineel gelijk; met de optie verandert de oorspronkelijke waarde |
📎 Andere opties: volgens de officiële handleiding
| Optie | Taak | |
|---|---|---|
| -f | Leest het script uit een bestand en voert het uit | |
| -r | Uitgebreide reguliere expressies, gelijk aan -E (-E is beter overdraagbaar) | |
| -s | Behandelt meerdere bestanden apart in plaats van als één doorlopende stroom | |
| -z | Scheidt regels met het null-teken in plaats van een regeleinde | |
| -u | Leest invoer in kleinere stukken en geeft uitvoer vaker door | |
| --posix | Schakelt alle GNU-uitbreidingen uit | |
| --debug | Toont het verloop van de uitvoering uitgebreid |
🔲 Simulator van het sed-commando
In de werkmap van de simulator hieronder staan een kopie van wp-config.php en example.conf. Je kunt de commando's tot nu toe zelf invoeren en met -i gewijzigde bestanden controleren met ls -l en diff.
🔢 FAQ & aanbevolen content







ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.