Eu tenho isto:
sed -i '/^$/d' temp_spec.rb
que remove linhas em branco e funciona bem. Como posso fazer isso apenas para as linhas 5-999 (ou, idealmente, 5 para o final do arquivo).
Eu tentei:
sed -n5,999 -i '/^$/d' temp_spec.rb
sed '5,999!d/^$/d' temp_spec.rb
mas nem funcionou (sem erros).
Respostas:
Se você deseja excluir todas as linhas em branco que começam com a linha 5 e manter as linhas de 1 a 4, use
Como
{
é o operador de agrupamento, o primeiro comando5,${
significa "da linha 5 até o final da entrada ($
), execute os seguintes comandos até a correspondência}
". Os comandos entre{
e}
podem ser prefixados novamente por endereços; portanto, o comando interno/^$/d
significa "se não houver nada entre o início (^
) e o final ($
) da linha, exclua-o". Os comandos Sed podem ser separados por;
. (Esse é um recurso mal documentado do sed. É suportado pela maioria das implementações do sed, mas não é totalmente portátil .) Como observado por Hauke, o;
depois{
é opcional; o anterior}
é necessário, no entanto.Se você deseja excluir todas as linhas em branco iniciadas na linha 5 e também as linhas 1 a 4, é mais fácil:
fonte
;
também.;
.Outra opção usando o awk:
fonte
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 sedif ... then
.T
teria sido mais fácil, mas está disponível apenas para o GNU sed. Eu cito a página de manual: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 comandod
deve ser executado. Caso contrário, nada deve ser feito. Comot
não pula no caso de umas
ação, preciso do comando branchb
para pular para o final do script.: label
são alvos de ramificação. Comogoto
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, facilitandos
o comando mais complicado, mas o restante:^..*$
significa "linha não vazia" e\1
significa "o conteúdo dos primeiros colchetes".fonte