¿Eliminar un patrón de un archivo y agregarlo al final?

¿Eliminar un patrón de un archivo y agregarlo al final?

Tengo un archivo de registro que tiene contenidos como el siguiente:

 #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 

Quiero eliminar todas esas líneas del archivo y agregarlas al final del archivo de manera que quede 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#

Estoy pensando en usarlo sed -n '/These*/{n;p}'pero aún no puedo lograr el resultado.

NOTA: ALGUNOS MÁS DATOS significan más contenido en el archivo y este tipo de líneas pueden estar en cualquier parte del archivo.

These switches don't have latest images :
SWEs-elmPCI-B-01#

Respuesta1

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

Se podría utilizar el espacio de retención en lugar de un archivo temporal:

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

Sin embargo, esto fallará si el archivo termina con uno de los bloques "Estos interruptores", en lugar de "ALGUNOS MÁS DATOS". La razón es que el último comando ${x;....p;}se ejecuta solo si la última línea no se ha eliminado antes mediante un dcomando. Si desea evitar archivos temporales, probablemente sea mejor usar Perl o Python. Ciertamente es más legible.

información relacionada