Como analisar vários padrões de string no script shell do Linux

Como analisar vários padrões de string no script shell do Linux

Sou novo no shell do Linux e tive dificuldade em pensar na solução para isso. Alguém pode ajudar como analisar múltiplas strings (dados) em um arquivo? Para o arquivo abaixo, quero analisar todos os valores próximos aos BIG*20021208*00001**seguintes: A999, A1000, 1001.

ST*810*0001
BIG*20021208*00001**A9
99*N1*ST*XYZ Test Corporation*9*122334455
N3*987 Freeway Dr.
N4*New York*NY*98765
N1*BT*ABC Test Company*9*122334455
N3*123 Highway Street
N4*Los Angeles*CA*12345
ITD*01*3*2**30**30*****60
FOB*PP
IT1**1*EA*200**UA*EAN
PID*F****Lamp
IT1**4*EA*50**UA*EAN
PID*F****Chair
TDS*2000
CAD*****Routing
ISS*30*CA
CTT*50
SE*19*0001
ST*810*0002
BIG*20021208*00001**A1000
N1*ST*XYZ Test Corporation*9*122334455
N3*987 Freeway Dr.
N4*New York*NY*98765
N1*BT*ABC Test Company*9*122334455
N3*123 Highway Street
N4*Los Angeles*CA*12345
ITD*01*3*2**30**30*****60
FOB*PP
IT1**1*EA*200**UA*EAN
PID*F****Lamp
IT1**4*EA*50**UA*EAN
PID*F****Chair
TDS*2000
CAD*****Routing
ISS*30*CA
CTT*50
SE*19*0002
ST*810*0003
BIG*20021208*00001**10
01N1*ST*XYZ Test Corporation*9*122334455
N3*987 Freeway Dr.
N4*New York*NY*98765
N1*BT*ABC Test Company*9*122334455
N3*123 Highway Street
N4*Los Angeles*CA*12345
ITD*01*3*2**30**30*****60
FOB*PP
IT1**1*EA*200**UA*EAN
PID*F****Lamp
IT1**4*EA*50**UA*EAN
PID*F****Chair
TDS*2000
CAD*****Routing
ISS*30*CA
CTT*50
SE*19*0003

Agora, como você pode ver no segmento BIG, o valor A999 já estava separado (não está mais intacto). Então meu problema agora é que quando eu obtiver os dados (por exemplo, A999), ele gerará apenas esse A9 e não o valor inteiro que é A999. Existe alguma solução alternativa para isso?

Responder1

sed '/BIG.20021208.00001/!d;s/.*\*//' <<\DATA
    ST*810*0001
    BIG*20021208*00001**A999
    N1*ST*XYZ Test Corporation*9*122334455
    N3*987 Freeway Dr.
    N4*New York*NY*98765
    N1*BT*ABC Test Company*9*122334455
    N3*123 Highway Street
    N4*Los Angeles*CA*12345
    ITD*01*3*2**30**30*****60
    FOB*PP
    IT1**1*EA*200**UA*EAN
    PID*F****Lamp
    IT1**4*EA*50**UA*EAN
    PID*F****Chair
    TDS*2000
    CAD*****Routing
    ISS*30*CA
    CTT*50
    SE*19*0001
    ST*810*0002
    BIG*20021208*00001**A1000
    N1*ST*XYZ Test Corporation*9*122334455
    N3*987 Freeway Dr.
    N4*New York*NY*98765
    N1*BT*ABC Test Company*9*122334455
    N3*123 Highway Street
    N4*Los Angeles*CA*12345
    ITD*01*3*2**30**30*****60
    FOB*PP
    IT1**1*EA*200**UA*EAN
    PID*F****Lamp
    IT1**4*EA*50**UA*EAN
    PID*F****Chair
    TDS*2000
    CAD*****Routing
    ISS*30*CA
    CTT*50
    SE*19*0001
    ST*810*0002
    BIG*20021208*00001**A1000
    N1*ST*XYZ Test Corporation*9*122334455
    N3*987 Freeway Dr.
    N4*New York*NY*98765
    N1*BT*ABC Test Company*9*122334455
    N3*123 Highway Street
    N4*Los Angeles*CA*12345
    ITD*01*3*2**30**30*****60
    FOB*PP
    IT1**1*EA*200**UA*EAN
    PID*F****Lamp
    IT1**4*EA*50**UA*EAN
    PID*F****Chair
    TDS*2000
    CAD*****Routing
    ISS*30*CA
    CTT*50
    SE*19*0002
    ST*810*0003
    BIG*20021208*00001**1001
    N1*ST*XYZ Test Corporation*9*122334455
    N3*987 Freeway Dr.
    N4*New York*NY*98765
    N1*BT*ABC Test Company*9*122334455
    N3*123 Highway Street
    N4*Los Angeles*CA*12345
    ITD*01*3*2**30**30*****60
    FOB*PP
    IT1**1*EA*200**UA*EAN
    PID*F****Lamp
    IT1**4*EA*50**UA*EAN
    PID*F****Chair
    TDS*2000
    CAD*****Routing
    ISS*30*CA
    CTT*50
    SE*19*0003
DATA

Isso produz apenas estes resultados:

A999
A1000
1001

Responder2

Com GNU grepvocê pode tentar:

$ grep -oP 'BIG\*20021208\*00001\*\*\K.*' file
A999
A1000
1001

Se sua grepversão não suportar PCRE, você poderá usar perl:

$ perl -nle 'print $& if /BIG\*20021208\*00001\*\*\K.*/'

informação relacionada