Удалить шаблон из файла и добавить его в конец?

Удалить шаблон из файла и добавить его в конец?

У меня есть файл журнала, содержимое которого примерно такое:

 #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. Это, безусловно, более читабельно.

Связанный контент