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,d
a elimina. -
Se isso acontecer, substitui
P1
porValue:
-
Em seguida, ele define o rótulo
:n
ext e extrai a linhaN
ext. -
Se
\nP2
for!
, não encontreib
ranches de volta ao rótulo:n
ext e tente novamente repetidamente até ocorrer. -
Em seguida, exclui qualquer ocorrência de
:.*\n10,9
até o primeiro caractere/
. -
Exclui o primeiro ewline
\n
disponí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