sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb
Editar 1:
Eu devo explicar isso, assim ...
Isso é desnecessariamente complicado. Eu não sabia que intervalos de endereços são permitidos dentro {}
. Então eu tive que expressar "excluir linhas vazias" de maneira diferente. O comando principal é t
qual é o modo de sed if ... then
. T
teria sido mais fácil, mas está disponível apenas para o GNU sed. Eu cito a página de manual:
t label: Se como /// fez uma substituição bem-sucedida desde a última leitura da linha de entrada e desde o último comando t ou T, ramifique para label; se o rótulo for omitido, ramifique para o final do script.
Eu abuso o famoso s
comando. Não deve substituir nada, mas apenas testar se a linha está vazia. Portanto, ele substitui uma linha vazia por uma linha vazia (poderia usar algo como substituição, pois a linha é excluída de qualquer maneira).
Se s
fez uma "substituição", a linha está vazia. Nesse caso, o comando d
deve ser executado. Caso contrário, nada deve ser feito. Como t
não pula no caso de uma s
ação, preciso do comando branch b
para pular para o final do script. : label
são alvos de ramificação. Como goto
naquela época na idade das trevas (quando o sed foi inventado ... te-hee).
Outra opção seria s
"substituir" todas as linhas não vazias, facilitando s
o comando mais complicado, mas o restante:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$
significa "linha não vazia" e \1
significa "o conteúdo dos primeiros colchetes".