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.