У меня есть файл журнала, содержимое которого примерно такое:
#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
Я хочу удалить все такие строки из файла и добавить их в конец файла таким образом, чтобы получилось так:
#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#
Я думаю об использовании sed -n '/These*/{n;p}'
, но пока не могу добиться результата.
ПРИМЕЧАНИЕ: SOME MORE DATA означает больше содержимого в файле, и эти типы строк могут находиться в любом месте файла.
These switches don't have latest images :
SWEs-elmPCI-B-01#
решение1
sed -ne '/^These/{n;w tempfile
d;};p' < oldfile > newfile
echo "These switches don't have latest images :" >> newfile
cat tempfile >> newfile
Вместо временного файла можно использовать пространство для хранения:
sed -ne '/^These/{n;H;d;};p;${x;s/^/These switches don'"'"'t have latest images :/;p;}' < oldfile > newfile
Однако это не сработает, если файл заканчивается одним из блоков "These switchs", а не "SOME MORE DATA". Причина в том, что последняя команда ${x;....p;}
выполняется только в том случае, если последняя строка не была удалена ранее командой
d
. Если вы хотите избежать временных файлов, то, вероятно, лучше использовать perl или python. Это, безусловно, более читабельно.