Isso funciona e é totalmente portátil:
sed '\|^P1.*|!d;s||Value:|
:n
N;\|\nP2|!bn
s|:.*\n10,9[^/]*/|:|
s|\n.*||;s|:$|:NULL|'
O fluxo funciona assim:
-
Primeiro, ele aborda uma linha
^começando comP1 -
Se a linha atual
!não corresponder a ela,da elimina. -
Se isso acontecer, substitui
P1porValue: -
Em seguida, ele define o rótulo
:next e extrai a linhaNext. -
Se
\nP2for!, não encontreibranches de volta ao rótulo:next e tente novamente repetidamente até ocorrer. -
Em seguida, exclui qualquer ocorrência de
:.*\n10,9até o primeiro caractere/. -
Exclui o primeiro ewline
\ndisponível e todos os caracteres a seguir. -
Se o último caractere for o
:dois pontos apósValue, ele insere a stringNULL.
As etapas 6 e 7 são o que o faz funcionar - em 6, ele exclui o \n ewline que precede a sequência de números desejada, mas se isso não estiver lá, o próximo \n ewline será o imediatamente seguinte Value: so tudo vai no passo 7.
Aqui está em ação:
sed '\|^P1.*|!d;s||Value:|
:n
N;\|\nP2|!bn
s|:.*\n10,9[^/]*/|:|
s|\n.*||;s|:$|:NULL|' <<\DATA
P1
10,9:6/123456
P2
blah blah
P1
10,9:5/98765
P2
blah
blah
P1
blah blah
P2
DATA
OUTPUT:
Value:123456
Value:98765
Value:NULL