Localizando e extraindo caracteres imediatos

1

Eu tenho um arquivo com alguns SQLs e quero descobrir os campos que foram convertidos usando scripts de shell.

Por exemplo, eu tenho um arquivo abc.txt com o sql

abaixo

SELECT field1,field2,field3,field4,cast(field5 as integer),cast(substr(field6,5,10) as integer),(case when field7 = '0000/00/00' then cast(field7 as date) else (field8 as date) end) as field7, substr(field9,5,10) FROM TEMP;

Saída desejada:

field5

field6

field7

    
por Balaji 16.04.2018 / 12:44

2 respostas

0

Como sobre o seguinte:

awk 'BEGIN{FS="cast\(";OFS="\n\n"}{ for(i = 1; i <= NF; i++) { sub("[ ),].*","",$i);gsub("^.*\(","",$i) } {$1=""; print}}'

Esta solução itera sobre instâncias de "cast (" em qualquer linha, depois remove prefixos e sufixos.

    
por 16.04.2018 / 13:24
0

Para procurar por field<decimals> ocorrrences dentro de cast(...) , supondo que não haja parênteses sem correspondência, com GNU grep ou compatível com o suporte a PCRE:

<abc.txt grep -Po 'cast(\((?:[^()]++|(?1))*\))' |
  grep -Po '\bfield\d+\b'

Isso está usando a capacidade do PCRE de definir expressões regulares recursivas . Acima de (?1) refere-se à expressão regular incluída em (...) , portanto, estamos procurando cast seguido por um regexp "R" que começa com ( seguido por qualquer número de não-pais ( ++ é apenas a versão sem retrocesso de + ) ou mais "R" s seguidos por ) .

Isso nos permite encontrar o ) correspondente para a abertura ( que segue cast .

O segundo grep apenas extrai o field<decimal> (rodeado por limites de palavras ( \b )) das instruções cast(...) que o primeiro grep extrai.

Isso pressupõe que essas instruções SQL estejam em uma única linha. Caso contrário, você pode adicionar a opção -z ao primeiro grep .

    
por 16.04.2018 / 14:05