sed, parte III: Selecionando as linhas em que vamos trabalhar

parte I: O que é e para que serve
parte II: Enviando dados pro sed
parte III: Selecionando as linhas em que vamos trabalhar
parte IV: Substituindo
parte V: Scripts em sed
parte VI: Expressões Regulares
parte VII: Referenciando com &
parte VIII: Back Reference
parte IX: Hold Space ou Espaço Reserva
parte X: Por onde prosseguir e Considerações Finais
parte XI: Comandos de uma linha só


Vamos mostrar como especificar endereços (linhas, strings, trechos de string etc.) pro sed trabalhar.
Para efeitos de estudo, salve o arquivo como 'teste.txt' e nele digite
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ço

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 apagar 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 elemtno 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, para vermos o que foi apagado, negamos o endereçamento:
cat teste.txt | sed '1~3!d'

Nenhum comentário: