Excluindo um padrão de um arquivo e anexando-o ao final?

2

Eu tenho um arquivo de log com conteúdo como abaixo:

 #SOME MORE DATA 
These switches don't have latest images :
SWEs-elmPCI-A-01#
 #SOME MORE DATA     
These switches don't have latest images :
SWEs-elmPCI-B-01#
 #SOME MORE DATA    
These switches don't have latest images :
SWEs-elmPCI-C-01#
 #SOME MORE DATA     
These switches don't have latest images :
SWEs-elmPCI-D-01#
 #SOME MORE DATA    
These switches don't have latest images :
SWEs-elmPCI-B-01#
 #SOME MORE DATA 

Quero excluir todas as linhas do arquivo e anexá-las ao final  do arquivo de tal forma que se torne como:

#ALL the remaining data at top
These switches don't have latest images :
SWEs-elmPCI-A-01#
SWEs-elmPCI-B-01#
SWEs-elmPCI-C-01#
SWEs-elmPCI-D-01#
SWEs-elmPCI-B-01#

Estou pensando em usar sed -n '/These*/{n;p}' , mas ainda incapaz de alcançar o resultado.

NOTA: ALGUNS MAIS DADOS significam mais conteúdo no arquivo e esses tipos de linhas podem estar em qualquer lugar no arquivo

These switches don't have latest images :
SWEs-elmPCI-B-01#
    
por munish 26.04.2013 / 16:38

1 resposta

3
sed -ne '/^These/{n;w tempfile
d;};p' < oldfile > newfile
echo "These switches don't have latest images :" >> newfile
cat tempfile >> newfile

Pode-se usar o espaço de espera em vez de um arquivo temporário:

sed -ne '/^These/{n;H;d;};p;${x;s/^/These switches don'"'"'t have latest images :/;p;}' < oldfile > newfile

Isso falhará, no entanto, se o arquivo terminar com um dos blocos "These switches", em vez de "SOME MAIS DADOS". O motivo é que o último comando ${x;....p;} é executado apenas se a última linha não tiver sido excluída antes por um d comando. Se você quiser evitar arquivos temporários, provavelmente é melhor usar perl ou python. É certamente mais legível.

    
por 26.04.2013 / 17:18