Comando sed: substituição de texto, exclusão de linhas e uso da opção -i

Ambiente de testeFamília RHELAlmaLinux 9.8conta rootVerificado em 2026-10-28

O comando sed é uma ferramenta do Linux que lê um arquivo linha por linha e executa substituições, exclusões e inserções, permitindo que você altere valores de um arquivo de configuração sem abrir um editor. Ao executar o sed em uma cópia do wp-config.php do WordPress em um servidor AlmaLinux 9, conseguimos alterar o nome do banco de dados mantendo o original com -i.bak.

As mensagens de erro deste artigo estão exatamente como foram impressas em uma locale em inglês.

1️⃣ Uso básico do comando sed e substituição com s

O comando s, o mais usado, substitui textos no formato [s/texto a buscar/texto novo/]. Ele troca apenas a primeira ocorrência de cada linha.

echo 'http://example.com http://example.com/blog' | sed 's/http:/https:/'
https://example.com http://example.com/blog

Para trocar todas as ocorrências da linha, adicione a flag g no final.

echo 'http://example.com http://example.com/blog' | sed 's/http:/https:/g'
https://example.com https://example.com/blog

Se você colocar o nome de um arquivo no final, o sed lê esse arquivo e imprime o resultado alterado. Em uma cópia do wp-config-sample.php do WordPress feita como wp-config.php, trocamos o valor de DB_USER e conferimos só essa linha com grep.

sed 's/username_here/wp_user/' wp-config.php | grep DB_USER
define( 'DB_USER', 'wp_user' );

Como o valor mudou na saída, é fácil achar que o arquivo também mudou, mas sem opções o sed só imprime o resultado na tela e deixa o arquivo original como está. Ao procurar a mesma linha no arquivo de novo, o valor inicial continuava lá.

grep DB_USER wp-config.php
define( 'DB_USER', 'username_here' );

Para alterar também o arquivo original, use a opção -i de 4️⃣.

2️⃣ Selecionar linhas no sed por número e padrão (-n, p)

Sem endereço, o comando s vale para todas as linhas. Para trabalhar só com algumas, escreva um número de linha ou padrão como endereço antes do comando. -n desativa a impressão automática e p imprime as linhas selecionadas. Juntos, mostram só a linha 23.

sed -n '23p' wp-config.php
define( 'DB_NAME', 'database_name_here' );

Unindo dois números de linha com uma vírgula, aparece esse intervalo. As linhas 23 a 32 são o trecho com as configurações de nome do banco de dados, usuário, senha e host.

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' );

Se você escrever um padrão entre barras em vez de um número de linha, todas as linhas com esse padrão são selecionadas.

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', '' );

O comando [=] imprime o número da linha selecionada. O endereço $ significa a última linha, então [$=] mostra o total de linhas do arquivo.

sed -n '/DB_HOST/=' wp-config.php
32
sed -n '$=' wp-config.php
102

O endereço também pode vir antes do comando s. Abaixo está o resultado de trocar localhost só na linha 32 e imprimir só a linha alterada com a flag p.

sed -n '32s/localhost/127.0.0.1/p' wp-config.php
define( 'DB_HOST', '127.0.0.1' );

Ao executar p sem -n, a linha selecionada apareceu mais uma vez. O sed lê as linhas uma a uma no espaço de padrões, executa os comandos e depois imprime automaticamente o espaço de padrões, por isso a linha 2 impressa por p aparece de novo com a impressão automática.

sed '2p' wp-config.php | head -n 4
<?php
/**
/**
 * The base configuration for WordPress

Esse método de ler e processar linha por linha é como uma esteira de fábrica que coloca as peças uma a uma na bancada, processa e passa para a próxima.

No diagrama abaixo, você pode comparar passo a passo o que cada comando imprime em cada linha.

🧭 Espaço de padrões do sed e impressão automática: p e d na linha 2
Diagrama explicativo
⚙️ Comando
$ sed '2p'-n '2p''2d' wp-config.php
Linha lidaExecução do comando e saída
Linha 1 → espaço de padrões<?php
➜
Diferente do endereço 2: sem comandoImpressão automática 1 vezSem saída por causa de -n
Linha 2 → espaço de padrões/**
➜
Igual ao endereço 2: executa pIgual ao endereço 2: executa d1 vez por p + 1 vez automáticaSó 1 vez por pApaga o espaço de padrões e vai para a próxima linha
Linha 3 → espaço de padrões * The base configuration for WordPress
➜
Diferente do endereço 2: sem comandoImpressão automática 1 vezSem saída por causa de -n
🖥️ O que aparece na tela (linhas 1~3)
<?php/**/** * The base configuration for WordPress
p imprime o espaço de padrões mais uma vez, então sem -n a linha 2 aparece duas vezes.
-n desativa a impressão automática, então só a linha 2 selecionada por p aparece uma vez.
d apaga o espaço de padrões e vai para a próxima linha, então a linha 2 não é impressa automaticamente.

3️⃣ Excluir e inserir linhas com o comando sed (d, i, a)

d exclui as linhas selecionadas. Para ver o exemplo de configuração do nginx abaixo sem as linhas de comentário, selecione com o padrão [^ *#] as linhas que começam com # ou que só têm espaços antes de #.

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;
    }
}

Ao unir comandos com ponto e vírgula, [^$], que significa linha vazia, também é excluído. As duas linhas vazias que restaram depois de apagar os comentários sumiram, e só ficaram as linhas de configuração.

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 insere texto antes da linha selecionada e a insere depois. O resultado de inserir uma linha de comentário antes da linha 1 está abaixo.

sed '1i # managed by sed' example.conf | head -n 3
# managed by sed
# example.com
server {

É fácil achar que um texto recuado depois de a mantém o recuo, mas o GNU sed pula os espaços logo depois de a e insere apenas o texto.

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;
    }
}

Para manter o recuo, coloque uma barra invertida depois de a. Tudo a partir do espaço depois da barra invertida entra como texto.

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 troca a linha selecionada por inteiro. Abaixo estão as quatro primeiras linhas do resultado de trocar a linha listen 80 por 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️⃣ Editar arquivos diretamente com sed -i e nome do backup

-i salva o resultado no arquivo original em vez de mostrá-lo na tela. O texto colado logo depois de -i vai para o final do nome do arquivo de backup. wp-config.php e outros arquivos que o site lê devem ser editados com -i.bak, mantendo o original.

cp wp-config-sample.php wp-config.php
sed -i.bak 's/database_name_here/wordpress_db/' wp-config.php

Com -i, nada aparece na tela, então confira os arquivos com 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

O arquivo editado e o arquivo .bak ficaram lado a lado. O tamanho caiu 6 bytes porque database_name_here virou o mais curto wordpress_db. Comparando os dois arquivos com diff, você vê só a linha alterada.

diff wp-config.php.bak wp-config.php
23c23
< define( 'DB_NAME', 'database_name_here' );
---
> define( 'DB_NAME', 'wordpress_db' );

A linha alterada é a única linha DB_NAME, na linha 23.

Se houver vários valores para trocar, encadeie scripts com -e e execute tudo de uma vez.

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' );

Se você juntar -i e -e como [-ie], o e é lido como parte do nome do backup, e surgiu um arquivo wp-config.phpe como abaixo.

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 grava o conteúdo editado em um arquivo novo e depois o renomeia com o nome original, por isso o número de inode do arquivo muda entre antes e depois da execução.

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

O número de inode, que era 207618887 antes da execução, passou para 207618883.

Se o arquivo não existir ou você esquecer o nome dele, o sed termina com o erro abaixo e nenhum arquivo é alterado.

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️⃣ Expressões regulares do sed, troca de delimitador e opções

🔲 Expressões regulares e troca de delimitador

Ao trocar um valor com barras, como um caminho, o delimitador do comando s se mistura às barras do valor, então cada barra do valor precisa de uma barra invertida.

sed -n 's/\/var\/www\/example.com/\/srv\/www\/example.com/p' example.conf
    root /srv/www/example.com;

O caractere logo depois de s vira o delimitador, então ao trocar para |, que não está no valor, você obtém o mesmo resultado sem barras invertidas.

sed -n 's|/var/www/example.com|/srv/www/example.com|p' example.conf
    root /srv/www/example.com;

O ponto (.) em um padrão corresponde a qualquer caractere. Abaixo está o resultado de um padrão que busca example.com e também alterou exampleXcom.

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

Para buscar um ponto literal, coloque uma barra invertida antes dele.

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

A parte entre parênteses é chamada de volta no texto novo com [\1]. Com -E, parênteses e + são usados sem barras invertidas. Abaixo está o resultado de manter o número depois de listen e acrescentar default_server.

sed -nE 's/listen ([0-9]+);/listen \1 default_server;/p' example.conf
    listen 80 default_server;

Sem -E, o mesmo script lê os parênteses como texto e dá um erro de que não há grupo para chamar. Para usar sem -E, coloque barras invertidas nos parênteses e no +.

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;

[&] no texto novo significa todo o texto que correspondeu ao padrão, então você pode colocar # antes dessa parte e transformar a linha em comentário.

sed -n 's/server_name .*;/# &/p' example.conf
    # server_name example.com www.example.com;

🔲 Opções do comando sed

📌 Principais opções: resultados deste artigo

OpçãoTarefaResultado neste artigo
-nDesativa a impressão automática e imprime só as linhas selecionadas com psed -n '23p' mostra só a linha 23; sem -n, 2p imprime a linha 2 duas vezes
-iSalva o resultado no arquivo original em vez da tela (o texto logo depois vai para o final do nome do backup)-i.bak cria wp-config.php.bak; o número de inode muda depois da execução
-eEncadeia vários scripts e os executa de uma vezDB_USER e DB_PASSWORD mudam de uma vez; juntos como -ie, surge o backup wp-config.phpe
-EUsa expressões regulares estendidas (sem barra invertida em parênteses e +)Imprime listen 80 default_server;; o mesmo script sem -E dá o erro [invalid reference]
--follow-symlinksJunto com -i, edita o arquivo original para o qual o link apontaSem ela, um arquivo comum ocupa o lugar do link e o original não muda; com ela, o valor original muda

📎 Outras opções: segundo o manual oficial

OpçãoTarefa
-fLê o script de um arquivo e o executa
-rExpressões regulares estendidas, igual a -E (-E é mais portável)
-sTrata cada arquivo separadamente em vez de um fluxo contínuo
-zSepara as linhas com o caractere nulo em vez da quebra de linha
-uLê a entrada em quantidades menores e libera a saída com mais frequência
--posixDesativa todas as extensões GNU
--debugImprime o processo de execução de forma detalhada

🔲 Simulador do comando sed

A pasta de trabalho do simulador abaixo tem uma cópia de wp-config.php e example.conf. Você pode digitar os comandos vistos até aqui e conferir com ls -l e diff os arquivos alterados por -i.

Simulador do comando sedGNU sed
[root@server work]#
Use as teclas ↑↓ para chamar de volta os comandos digitados antes.

🔢 FAQ & conteúdo recomendado

O wp-config-sample.php do WordPress tem fins de linha CRLF, então há um [\r] invisível logo antes do fim da linha. [/false );$/] não imprimiu nenhuma linha, e em uma cópia com [\r] removido por [s/\r$//], o mesmo padrão encontrou a linha WP_DEBUG.

-i cria um novo arquivo comum no lugar do link e salva nele, então o original para o qual o link apontava não mudou. Para editar o arquivo original, indique também [--follow-symlinks]. Nesse caso, o link continuou e o valor original mudou.

Mesmo uma variável definida com NEW=wp_user não é expandida pelo shell dentro de aspas simples, e [$NEW] entra como texto literal. Com o script entre aspas duplas, o shell expandiu a variável primeiro e wp_user entrou no lugar de [$NEW].

🧭 Conteúdo recomendado sobre comandos de texto 9 posts · 2 referências
🗂️ Comandos para ver · editar texto
📄 Comando grep 📄 Comando sort 📄 Comando uniq 📄 Comando tee 📄 Comando sed
📄 Comando cat 📄 Comando less 📄 Comandos head · tail 📄 Comandos vi · vim

ℹ️ Aviso de afiliados
O conteúdo deste site contém links de afiliados. Quando um visitante compra um produto ou serviço por meio de um desses links, o site recebe uma comissão do vendedor. O valor que o comprador paga (em promoções, ele diminui ↓) não aumenta por causa disso. Preços, descontos e informações de estoque valem para o momento em que o texto foi escrito e podem ter mudado, por isso confirme com o vendedor antes de comprar. Os produtos são escolhidos e avaliados por critérios próprios, e o recebimento de comissão não influencia a ordem de apresentação nem o conteúdo das avaliações.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Demonstre sua humanidade: 1   +   7   =