Ein Muster aus einer Datei löschen und an das Ende anhängen?

Ein Muster aus einer Datei löschen und an das Ende anhängen?

Ich habe eine Protokolldatei mit folgendem Inhalt:

 #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 

Ich möchte alle diese Zeilen aus der Datei löschen und sie so an das Ende der Datei anhängen, dass es etwa so aussieht:

#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#

Ich überlege, es zu verwenden, sed -n '/These*/{n;p}'kann das gewünschte Ergebnis aber immer noch nicht erzielen.

HINWEIS: MEHR DATEN bedeutet mehr Inhalt in der Datei und diese Zeilentypen können überall in der Datei vorkommen.

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

Antwort1

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

Man könnte den Hold Space anstelle einer temporären Datei verwenden:

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

Dies schlägt jedoch fehl, wenn die Datei mit einem der Blöcke „Diese Schalter“ endet, anstatt mit „EINIGE WEITERE DATEN“. Der Grund dafür ist, dass der letzte Befehl ${x;....p;}nur ausgeführt wird, wenn die letzte Zeile nicht zuvor durch einen Befehl gelöscht wurde d. Wenn Sie temporäre Dateien vermeiden möchten, ist es wahrscheinlich besser, Perl oder Python zu verwenden. Das ist auf jeden Fall lesbarer.

verwandte Informationen