Alexandre Medeiros

Dicas para você passar na LPIC-1 e 2 e outros assuntos de TI

Utilização básica do comando sed

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