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'