Pular para o conteúdo

Sed - Introdução

Introdução ao Sed, por meio de exemplos, cobrindo os tópicos: enviando dados pro sed, selecionando as linhas para edição, substituição, scripts em sed, expressões regulares, referências por &, back reference, hold space/ espaço reserva, dicas de comandos, jogos, exemplos e material para prosseguir nos estudos sobre Sed.
jarlisson moreira jarlisson
Hits: 88.012 Categoria: Shell Script Subcategoria: Introdução
  • Indicar
  • Impressora
  • Denunciar

Parte 2: Enviando dados para o sed

Vamos usar o arquivo /etc/passwd.

Digite:

cat /etc/passwd

Agora vamos passar esse arquivo pro sed, através de pipe, | :

cat /etc/passwd | sed ''

O sed sempre mostra o resultado da edição feita em cada linha, nesse caso, nenhuma. Por isso aparece tudo do passwd.

Agora vamos deletar todas as linhas. Mas não se preocupe, vamos deletar somente o que está no buffer do sed:

cat /etc/passwd | sed 'd'

O comando d deleta a linha atual do buffer e imprime o resultado, de novo e de novo, até o fim do arquivo. Como não dissemos para escrever, ele apenas lê e não altera o arquivo.

Para redirecionar o resultado do sed, ao invés dele ser mostrado na tela, usamos a forma padrão do sed, com o '>':

cat /etc/passwd | sed 'd' > /tmp/newpasswd

Outra maneira de invocar dados pro sed, é através da flag -e, sem usar pipe. Desta maneira, faça no seguinte padrão:

sed -e 'comandos/de/edição' /caminho/do/arquivo

No nosso exemplo, ficaria:

sed -e 'd' /etc/passwd

Vale lembrar que em algumas versões do sed, não é necessário o '-e'. Teste aí no seu.

Note que o sed automaticamente imprime o resultado que foram processados. Caso não queira vê-los, use a flag '-n':

cat /etc/passwd | sed -n ''

Caso você queira que, em alguma situação, seja mostrado algo, use o comando p, como o comando d. Ou seja, o comando a seguir não tem efeito nenhum:

cat /etc/passwd | sed -n 'p' | head -10

O head é pra mostrar apenas as primeiras saídas.

Vamos mostrar como especificar endereços pro sed trabalhar.

Para efeitos de estudo, salve arquivo: teste.txt

1
2
3
4
5
6


Para apagar a linha n, use 'nd' ao invés de somente 'd', como foi mostrado antes:

cat teste.txt | sed '1d'

Nesse caso, o sed percorre cada linha e aplica o comando. O comando é 'caso a linha seja a primeira, apague-a'.

Intervalo de endereços

Para definirmos um intervalo para o sed operar, colocamos o endereço do início separado do endereço do fim separado por vírgula. Por exemplo, vamos apagar da segunda até a quarta linha:

cat teste.txt | sed '2,4d'

Sabendo que o sed trabalha de forma sequencial, sempre do início pro fim do arquivo, interprete o resultado de:

cat teste.txt | sed '4,2d'

Se quisermos apagar uma linha e as próximas 3, por exemplo, usamos '+3' como endereço:

cat teste.txt | sed '1,+3d'

Porém, se ao invés de apagar certas linhas quisermos apagas todas as outras, menos ela?

Simples, usamos o bom e velho operador de negação '!', após o endereçamento.

Vamos apagar todas, menos a primeira linha:

cat teste.txt | sed '1!d'

Todo, menos da terceira até a quinta linha:

cat teste.txt | sed '3,5!d'

Ou:

cat teste.txt | sed '3,+2!d'

Endereços em forma de PA

Se lembra de PA - Progressão Aritmética?

Por exemplo, uma PA de elemento inicial 1 e razão 3: 1, 4, 7, 10.

Podemos usar isso em sed com o comando a~r, onde "a" é o número inicial, e "r" a razão. Exemplo:

cat teste.txt | sed '1~3d'

Muitas vezes, queremos ver o que foi apagado, para isso negamos o endereçamento:

cat teste.txt | sed '1~3!d'

   1. Introdução - o que é e para que serve
   2. Enviando dados para o sed
   3. Substituindo
   4. Scripts em sed
   5. Expressões regulares
   6. Referenciando com & - Back reference
   7. Hold space
   8. Por onde prosseguir e considerações finais

Shell - Funções

AWK - Introdução

Processos

Pipelines (Canalizadores)

LibreOffice Math

Explorando a entrada de dados com READ em Bash Shell

Trabalhar com array no Bash

Programação com Shell Script

Algoritmos em Shell Script

Introdução ao Fortran (parte 1)

#1 Comentário enviado por eldermarco em 16/07/2012 - 10:53h
Muito bom! Super bem escrito e bastante didático, exatamente como o artigo sobre o AWK que você escreveu. Nota 10!
#2 Comentário enviado por removido em 16/07/2012 - 12:42h
i like too!
#3 Comentário enviado por eduardo em 16/07/2012 - 14:13h
Ótimo artigo! Parabéns! Acabei de perceber que uso menos de 5% do poder do sed. :)
#4 Comentário enviado por sir.guil em 16/07/2012 - 15:05h
Parabéns, era uma coisa que faltava aqui no vol,

sempre que precisei estudar o sed, dependi do http://aurelio.net/sed/

agora estamos + completos
#5 Comentário enviado por julio_hoffimann em 16/07/2012 - 17:56h
Novamente parabéns Jarlisson!

Artigos bastante claros que ajudarão muitos no VOL.

Abraço!
#6 Comentário enviado por marcelo.castro.l em 17/07/2012 - 08:10h
Cara, muito bom esse artigo.
Salvou minha pátria aqui na empresa.
Precisava manipular um arquivo gerado pelo:

#iptables -L

Porém não precisava dele formatado com os espaços, graças ao "sed" tudo fluiu perfeitamente.

Obrigado!
#7 Comentário enviado por H4cktz em 19/02/2019 - 12:09h
Muito bom! Super bem escrito e bastante didático, Nota 1000! Finalmente estou aprendendo SED!

Contribuir com comentário

Entre na sua conta para comentar.