O comando sed é bastante utilizado para procurar e substituir padrões em textos e mostrar o resultado final na saída padrão.
A sintaxe do comando sed é:
sed [opções] “comando e expressão regular” [arquivo]
A expressão regular no comando sed fica declarada entre barras (/).
Exemplo:
$ sed -e "/^#/d" /etc/hosts
O comando sed acima irá mostrar o conteúdo do arquivo /etc/hosts sem as linhas que começarem por #, ou seja, não mostrará as linhas que estão comentadas. A letra d significa um comando de expressão regular do sed onde o mesmo irá excluir (delete) as linhas que contenham o padrão especificado entre as barras / /.
Opções do comando sed:
-e => Executa a expressão e comando a seguir.
-f => Lê as expressões e comandos passados pelo arquivo indicado.
-n => Não irá mostrar linhas que não sejam iguais à expressão citada.
Os comandos mais comuns utilizados pelo sed são:
-s => substitui
-d => apaga (delete)
r => reescreve o conteúdo
w => escreve (write)
g => substitui tudo o que achar com a expressão informada na linha atual.
Vale lembrar que o comando sed não altera o conteúdo do arquivo original. Se você quiser fazer isso precisará direcionar a saída padrão do comando para outro arquivo.
Segue abaixo 15 exemplos para te ajudar.
O arquivo utilizado para os testes está abaixo para comparação:
# cat sed-test.txt 1 Unix unix unix 23 2 linux Linux 34 3 linuxunix UnixLinux linux /bin/bash CentOS Linux OS Linux is free and opensource operating system
1) Como encontrar e substituir o “primeiro” evento do padrão em uma linha
O comando sed abaixo substitui a palavra unix pelo linux no arquivo. Isso altera apenas a primeira instância do padrão em cada linha.
# sed 's/unix/linux/' sed-test.txt 1 Unix linux unix 23 2 linux Linux 34 3 linuxlinux UnixLinux linux /bin/bash CentOS Linux OS Linux is free and opensource operating system
2) Como encontrar e substituir a “enésima” ocorrência do padrão em uma linha
Use os sinalizadores /1,/2,../n para substituir a ocorrência correspondente de um padrão em uma linha.
O comando sed abaixo substitui a segunda instância do padrão “unix” por “linux” em uma linha.
# sed 's/unix/linux/2' sed-test.txt 1 Unix unix linux 23 2 linux Linux 34 3 linuxunix UnixLinux linux /bin/bash CentOS Linux OS Linux is free and opensource operating system
3) Como pesquisar e substituir todas as instâncias do padrão em uma linha
O comando sed abaixo substitui todas as instâncias do formato “unix” por “Linux” na linha porque “g” significa uma substituição global.
# sed 's/unix/linux/g' sed-test.txt 1 Unix linux linux 23 2 linux Linux 34 3 linuxlinux UnixLinux linux /bin/bash CentOS Linux OS Linux is free and opensource operating system
4) Como encontrar e substituir o padrão para todas as instâncias em uma linha do evento “enésimo”
O comando sed abaixo substitui todos os padrões da instância “Nésima” de um padrão em uma linha.
# sed 's/unix/linux/2g' sed-test.txt 1 Unix unix linux 23 2 linux Linux 34 3 linuxunix UnixLinux linux /bin/bash CentOS Linux OS Linux is free and opensource operating system
5) Pesquise e substitua o padrão em um número de linha específico
Você pode substituir a sequência em um número de linha específico. O comando sed abaixo substitui o padrão “unix” por “linux” apenas na 3ª linha.
# sed '3 s/unix/linux/' sed-test.txt 1 Unix unix unix 23 2 linux Linux 34 3 linuxlinux UnixLinux linux /bin/bash CentOS Linux OS Linux is free and opensource operating system
6) Como encontrar e substituir padrão em um intervalo de linhas
Você pode especificar o intervalo de números de linha para substituir a sequência.
O comando sed abaixo substitui o padrão “Unix” por “Linux” com as linhas 1 a 3.
# sed '1,3 s/unix/linux/' sed-test.txt 1 Unix linux unix 23 2 linux Linux 34 3 linuxlinux UnixLinux linux /bin/bash CentOS Linux OS Linux is free and opensource operating system
7) Como encontrar e alterar o padrão na última linha
O comando sed abaixo permite substituir a sequência correspondente apenas na última linha.
# sed '$ s/Linux/Unix/' sed-test.txt 1 Unix unix unix 23 2 linux Linux 34 3 linuxunix UnixLinux linux /bin/bash CentOS Linux OS Unix is free and opensource operating system
8) Como encontrar e substituir o padrão com apenas a palavra certa em uma linha
Como você deve ter notado, a substring “linuxunix” é substituída por “linuxlinux” no sexto exemplo. Se você deseja substituir apenas a palavra correspondente correta, use a expressão de limite de palavra “\ b” nas duas extremidades da sequência de pesquisa.
# sed '1,3 s/\bunix\b/linux/' sed-test.txt 1 Unix linux unix 23 2 linux Linux 34 3 linuxunix UnixLinux linux /bin/bash CentOS Linux OS Linux is free and opensource operating system
9) Como pesquisar e substitui o padrão com distinção entre maiúsculas e minúsculas
O Linux diferencia maiúsculas de minúsculas. Para fazer o padrão coincidir com maiúsculas e minúsculas, use o sinalizador I.
# sed 's/unix/linux/gI' sed-test.txt 1 linux linux linux 23 2 linux Linux 34 3 linuxlinux linuxLinux linux /bin/bash CentOS Linux OS Linux is free and opensource operating system
10) Como localizar e substituir uma seqüência de caracteres que contém o caractere delimitador
Quando pesquisamos e substituímos por uma sequência com o caractere delimitador, precisamos usar a barra invertida “\” para escapar a barra.
Neste exemplo, vamos substituir o “/bin/bash” por “/usr/bin/fish”.
# sed 's/\/bin\/bash/\/usr\/bin\/fish/g' sed-test.txt 1 Unix unix unix 23 2 linux Linux 34 3 linuxunix UnixLinux linux /usr/bin/fish CentOS Linux OS Linux is free and opensource operating system
# sed 's|/bin/bash|/usr/bin/fish/|g' sed-test.txt 1 Unix unix unix 23 2 linux Linux 34 3 linuxunix UnixLinux linux /usr/bin/fish/ CentOS Linux OS Linux is free and opensource operating system
11) Como localizar e substituir dígitos por um determinado padrão
Da mesma forma, os dígitos podem ser substituídos pelo padrão. O comando sed abaixo substitui todos os dígitos pelo padrão “[0-9]” “número”.
# sed 's/[0-9]/number/g' sed-test.txt number Unix unix unix numbernumber number linux Linux numbernumber number linuxunix UnixLinux linux /bin/bash CentOS Linux OS Linux is free and opensource operating system
12) Como encontrar e substituir apenas dois números de dígitos pelo padrão
Se você deseja substituir os números de dois dígitos pelo padrão, use o comando sed abaixo.
# sed 's/\b[0-9]\{2\}\b/number/g' sed-test.txt 1 Unix unix unix number 2 linux Linux number 3 linuxunix UnixLinux linux /bin/bash CentOS Linux OS Linux is free and opensource operating system
13) Como imprimir apenas linhas substituídas com o comando sed
Se você deseja exibir apenas as linhas alteradas, use o comando sed abaixo.
p – Imprime a linha substituída duas vezes no terminal.
n – suprime as linhas duplicadas geradas pelo sinalizador “p”.
# sed -n 's/Unix/Linux/p' sed-test.txt 1 Linux unix unix 23 3 linuxunix LinuxLinux
14) Como executar vários comandos sed de uma só vez
O comando sed a seguir detecta e substitui dois padrões diferentes simultaneamente, ele pesquisa os padrões “linuxunix” e “CentOS”, substituindo-os por “LINUXUNIX” e “RHEL8” de cada vez.
# sed -e 's/linuxunix/LINUXUNIX/g' -e 's/CentOS/RHEL8/g' sed-test.txt 1 Unix unix unix 23 2 linux Linux 34 3 LINUXUNIX UnixLinux linux /bin/bash RHEL8 Linux OS Linux is free and opensource operating system
O comando sed a seguir procura dois padrões diferentes e os substitui por uma sequência de cada vez. Ele pesquisa os padrões “linuxunix” e “CentOS”, substituindo-os por “Fedora30” de cada vez.
# sed -e 's/\(linuxunix\|CentOS\)/Fedora30/g' sed-test.txt 1 Unix unix unix 23 2 linux Linux 34 3 Fedora30 UnixLinux linux /bin/bash Fedora30 Linux OS Linux is free and opensource operating system
15) Como localizar e substituir a linha inteira se o padrão fornecido corresponder
Se o padrão corresponder, você poderá usar o comando sed para substituir a linha inteira pela nova. Isso pode ser feito usando a flag “C”.
# sed '/OS/ c New Line' sed-test.txt 1 Unix unix unix 23 2 linux Linux 34 3 linuxunix UnixLinux New Line Linux is free and opensource operating system
16) Como pesquisar e substituir linhas que correspondem a um padrão
Você pode especificar um padrão para o comando sed caber em uma linha. No caso de correspondência de padrões, o comando sed procura a sequência a ser substituída.
O comando sed abaixo primeiro procura por linhas que tenham o padrão “OS” e, em seguida, substitui a palavra “Linux” por “ArchLinux”.
# sed '/OS/ s/Linux/ArchLinux/' sed-test.txt 1 Unix unix unix 23 2 linux Linux 34 3 linuxunix UnixLinux linux /bin/bash CentOS ArchLinux OS Linux is free and opensource operating system