Como posso extrair uma string específica no Linux?

Como posso extrair uma string específica no Linux?

Sou novato em Bash e tive dificuldade em como vou conseguir a string específica no meu arquivo abaixo:

  DS*SC*S45WG*X56558*2
  NE*823*2*SC*q345w45*DT*RTD*7530SRT
  RJTROIT**20140617
  SNA**TP*55
  DS*SC*S45WG*X56558*2
  NE*17*2*SC*211*DT*DFS*75304KSRTRSHT**20140617
  RSS**TP*55
  DS*SC*S45WG*X56558*2
  NE*18*1*SC*3435*DT*PR*753SLRT
  JSRT**20140617~RSS**TP*55
  DS*SC*S45WG*X56558*1
  NE*19*1*SC*ERS*DT*DFS*753048SRY
  TSERY4654**20140617~RSS**TP*60
  DS*SC*S45WG*X56558*1
  NE*19*1*SC*FRAE*DT*ESS*753048499RYTSR**20140722
  RSS**TP*140
  DS*SC*S45WG*X56558*1
  NE*73*46464
  SD**15769
  SNA*PUI*000015769

Com este arquivo que afirmei acima, desejo obter todos os seguintes dados/valores:

7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR

(aqueles próximos a NE*823*2*SC*q345w45*DT*RTD por exemplo). Obrigado!

Responder1

Como os valores nos quais você está interessado parecem estar divididos em várias linhas, eu confiaria em um regexp perl puro para corresponder aos padrões corretos:

cat file.txt | perl -e 's/\s//g && print "$_\n" for join("", <>) =~ /\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm'

Observação: presumi que os valores que você está procurando terminam com este delimitador:

XXX**TPonde XXXpoderia estar RSSou SNAno seu exemplo.

Como funciona

  • join("", <>)está criando uma única string a partir do resultado do catcomando
  • que uso para analisar (o =~operador) usando esta expressão regular:

    /\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm

    Este regexp procura strings começando com uma estrela \*e compostas de [A-Za-z0-9_] caracteres (o atalho é \wpara palavras) e espaços \s, um possível ~(0 ou 1 vez) e depois 3 caracteres de palavra (por exemplo: RSSou SNA) dois estrelas \*\*seguidas por TP.

    Parênteses são usados ​​para capturar apenas o padrão entre eles.

    /gmsão modificadores regexp onde gretornarão todas as strings correspondentes (não apenas a primeira) e mpermitirão pesquisas multilinhas.

  • A forinstrução percorre todos os resultados e chama cada correspondência encontrada s/\s//g && print "$_\n".

    s/\s//gremove todos os espaços (incluindo retornos de carro) e print "$_\n"gera o resultado final ( $_sendo o valor atual no loop for)

Isso me dá os valores esperados (sem codificá-los no comando):

7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR

Atualizar: (para incluir o padrão de data)

Por favor, use o seguinte comando agora:

cat file.txt | perl -e 'for$a(join("", <>)=~/\*([A-Z0-9\s]+?)\*\*\d{8}/g){$a=~s/\s+//g;print"$a\n"}'

Responder2

Você pode usar catpara exibir o arquivo e grepobter apenas linhas com os valores desejados.

por exemplo:cat myfile | grep 7530SRTRJTROIT

ou para obter vários valores, você pode usar egrepo que permite expressões regulares:
egrep "7530SRTRJTROIT|75304KSRTRSHT|753SLRTJSRT|753048SRYTSERY4654|753048499RYTSR" myfile

informação relacionada