sed '$!N;/###$/s/IDLE/END/;P;D
' <<\DATA
22 Aug 19 16:47:33.159: <DATA> |POS|RINGING|1|1126710938|5950|$hostIp|$size |$data
23 Aug 19 16:47:33.453: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
24 Aug 19 16:47:33.484: <DATA> |POS|TRAINING|1|1126710938|5950|$hostIp|$size |$data
25 Aug 19 16:48:05.824: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
26 Aug 19 16:48:05.916: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
27 Aug 19 16:48:05.947: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
28 Aug 19 16:48:23.792: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
29 Aug 19 16:48:23.853: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
30 Aug 19 16:48:23.884: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
31 ##############################################################################
DATA
Que expande o buffer de uma linha normal de sed
para um buffer de duas linhas. Em cada linha, exceto a última, ela anexa a próxima linha de entrada ao espaço padrão. Se o buffer de duas linhas terminar com a string ###
, ele substitui a primeira string IDLE
com END
. Então, P
envia até a primeira nova linha que está ocorrendo no buffer e D
é igual antes de recomeçar com o que resta. É uma solução extremamente simples, POSIX-portátil e muito rápida para o seu problema.
OUTPUT
22 Aug 19 16:47:33.159: <DATA> |POS|RINGING|1|1126710938|5950|$hostIp|$size |$data
23 Aug 19 16:47:33.453: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
24 Aug 19 16:47:33.484: <DATA> |POS|TRAINING|1|1126710938|5950|$hostIp|$size |$data
25 Aug 19 16:48:05.824: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
26 Aug 19 16:48:05.916: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
27 Aug 19 16:48:05.947: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
28 Aug 19 16:48:23.792: <DATA> |POS|IDLE|1|1126710938|5950|$hostIp|$size |$data
29 Aug 19 16:48:23.853: <DATA> |POS|INIT|1|1126710938|5950|$hostIp|$size |$data
30 Aug 19 16:48:23.884: <DATA> |POS|END|1|1126710938|5950|$hostIp|$size |$data
31 ##############################################################################
Para editar um arquivo no local de forma portável, você pode fazer:
sed '$!N;/###$/s/IDLE/END/;P;D
' <<FILE >file
$(cat file)
FILE
Ou então, com o GNU sed
, pelo menos, você pode fazer:
sed -i '$!N;/###$/s/IDLE/END/;P;D' file