Comando sed: substituição de texto, exclusão de linhas e uso da opção -i
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/blogPara 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/blogSe 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_USERdefine( '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.phpdefine( '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.phpdefine( '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.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' );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.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', '' );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.php32sed -n '$=' wp-config.php102O 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.phpdefine( '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 WordPressEsse 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.
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.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;
}
}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.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 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.phpsed -i.bak 's/database_name_here/wordpress_db/' wp-config.phpCom -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.bakO 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.php23c23
< 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.phpgrep -n -e DB_USER -e DB_PASSWORD wp-config.php26: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.phpls 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.php207618887 wp-config.phpsed -i 's/localhost/127.0.0.1/' wp-config.phpls -i wp-config.php207618883 wp-config.phpO 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.phpsed: can't read no-such.php: No such file or directorysed -i 's/x/y/'sed: no input files5️⃣ 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.orgPara buscar um ponto literal, coloque uma barra invertida antes dele.
echo 'exampleXcom example.com' | sed 's/example\.com/test.org/g'exampleXcom test.orgA 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.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;[&] 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ção | Tarefa | Resultado neste artigo | |
|---|---|---|---|
| -n | Desativa a impressão automática e imprime só as linhas selecionadas com p | sed -n '23p' mostra só a linha 23; sem -n, 2p imprime a linha 2 duas vezes | |
| -i | Salva 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 | |
| -e | Encadeia vários scripts e os executa de uma vez | DB_USER e DB_PASSWORD mudam de uma vez; juntos como -ie, surge o backup wp-config.phpe | |
| -E | Usa 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-symlinks | Junto com -i, edita o arquivo original para o qual o link aponta | Sem 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ção | Tarefa | |
|---|---|---|
| -f | Lê o script de um arquivo e o executa | |
| -r | Expressões regulares estendidas, igual a -E (-E é mais portável) | |
| -s | Trata cada arquivo separadamente em vez de um fluxo contínuo | |
| -z | Separa as linhas com o caractere nulo em vez da quebra de linha | |
| -u | Lê a entrada em quantidades menores e libera a saída com mais frequência | |
| --posix | Desativa todas as extensões GNU | |
| --debug | Imprime 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.
🔢 FAQ & conteúdo recomendado







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