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
d
comando. Si desea evitar archivos temporales, probablemente sea mejor usar Perl o Python. Ciertamente es más legible.