Como posso extrair uma string específica no Linux? [fechadas]

1

Sou novato no Bash e tive uma dificuldade em obter 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 mencionei acima, desejo obter todos esses dados / valores a seguir:

7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR

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

    
por Anne 16.07.2014 / 10:10

2 respostas

1

Como os valores em que você está interessado parecem 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: suponho que os valores que você está procurando terminam com este delimitador:

XXX**TP em que XXX pode ser RSS ou SNA no seu exemplo.

Como funciona

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

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

    Este regexp procura por strings começando com uma estrela \* e feita de caracteres [A-Za-z0-9_] (o atalho é \w para palavras) e espaços \s , um possível ~ (0 ou 1 vez) e, em seguida, 3 caracteres de palavras (por exemplo: RSS ou SNA ), duas estrelas \*\* seguido por TP .

    Os parênteses são usados para capturar apenas o padrão entre eles.

    /gm são modificadores regexp, em que g retornará todas as sequências de correspondências (não apenas a primeira) e m permitirá pesquisas de várias linhas.

  • A instrução for faz um loop sobre todos os resultados e solicita que cada correspondência seja encontrada s/\s//g && print "$_\n" .

    s/\s//g remove todos os espaços (incluindo retornos de carro) e print "$_\n" imprime 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 datas)

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"}'
    
por Sylvain Pineau 16.07.2014 / 12:10
0

Você pode usar cat para exibir o arquivo e grep para obter apenas as linhas com os valores desejados.

por exemplo: cat myfile | grep 7530SRTRJTROIT

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

    
por Pabi 16.07.2014 / 10:21