Inserir aspas simples no arquivo de texto para uso como consulta SQL que segue os parens abertos usando sed

1

Eu tenho uma string de cláusula where no arquivo Unix como abaixo

where c1 in (a) and c2 in (a,b,c) and c3 in ()

Precisa de saída como

where c1 in ('a') and c2 in ('a','b','c') and c3 in ('')

Seria ótimo se alguém pudesse concluir isso.

    
por sai 26.04.2016 / 23:20

3 respostas

3

sed -r "s/,/','/g; s/\(([^)]+)\)/('')/g"

Vamos ver como isso altera a entrada que você forneceu:

where c1 in (a) and c2 in (a,b,c) and c3 in ()

Primeiro, as vírgulas são agrupadas entre aspas ( s/,/','/g ):

where c1 in (a) and c2 in (a','b','c) and c3 in ()

Em seguida, adicionamos aspas dentro dos parentes não vazios ( s/\(([^)]+)\)/('')/g ):

where c1 in ('a') and c2 in ('a','b','c') and c3 in ()

… qual é a saída que você queria.

Cuidado, pois essa expressão regular pode afetar outras linhas da maneira que você não quer.

    
por 26.04.2016 / 23:38
3

Você também pode fazer isso com um loop:

sed -e ':top' -e 's/\([(,]\)\([^),'\'']\{1,\}\)\([),]\)/'"''"'/;t top'

Ou usando -E :

sed -E -e ':top' -e "s/([(,])([^),']+)([),])/''/;t top"
    
por 26.04.2016 / 23:52
1

Se a única coisa em seu arquivo é uma cláusula WHERE, conforme descrito em sua postagem, isso deve ser feito:

$ sed -r "s/(\(|,)([^ ),]+)(\)|,)/''/g" <Filename>
where c1 in ('a') and c2 in ('a',b,'c') and c3 in ()

Se o seu arquivo estiver cheio de outros dados, como o restante da instrução SQL ou várias instruções SQL, isso poderá interferir em outro texto desse arquivo. Como sed não tem funcionalidade lookbehind / lookahead, você pode considerar uma alternativa mais segura em perl (se suas cláusulas WHERE estiverem em linhas separadas do restante de cada instrução SQL):

$ perl -ne "s/(\(|,)([^ ),]+)(\)|,)/''/g if /where/; print;" <Filename>
where c1 in ('a') and c2 in ('a',b,'c') and c3 in ()
    
por 27.04.2016 / 00:48

Tags