Como faço para escapar apóstrofos dentro de uma instrução awk?

4

Estou usando o Ubuntu Linux com o shell bash. Como faço para escapar apóstrofos dentro de uma instrução awk? Eu quero saída alguns SQL, depois de extrair dados de um arquivo usando o awk, então eu tenho:

awk -F',' '{print "SELECT * from user where id = '""';"}' myfile.csv

Mas isso é impresso apenas:

SELECT * from user where id = ;

Se eu modificar o acima para

awk -F',' '{print "SELECT * from user where id = "";"}' myfile.csv

então eu recebo uma declaração como

SELECT * from user where id = cf915247dfcf47b6814b5350e5cbdfd8;

mas não há aspas simples ao redor do id, que eu preciso.

    
por Dave 23.01.2017 / 21:26

3 respostas

2

Você pode querer abordar isso de duas maneiras:

  1. Passe aspas simples via variável:

    awk -v sq="'" -F',' '{print "SELECT * from user where id = "sqsq";"}' myfile.csv
    
  2. Faça uso do valor hexadecimal da aspa simples na instrução printf:

    awk -F',' '{printf "SELECT * from user where id = %c%s%c;\n",0x27,,0x27}' myfile.csv
    
por Sergiy Kolodyazhnyy 23.01.2017 / 21:46
1

Vai parecer uma loucura, mas aqui vai:

awk -F',' '{print "SELECT * from user where id = '"'"'"  "'"'"'" ";"}' myfile.csv

SELECT * from user where id = 'cf915247dfcf47b6814b5350e5cbdfd8';

Espero que isso ajude!

    
por Terrance 23.01.2017 / 21:43
0

Você pode usar apenas (ou 7 ) na sua string, que awk leva a significar ' .

awk -F, '{print "SELECT * from user where id = "  ";"}' myfile.csv

Isso é meio deselegante ("Qual é o valor mágico repetido mágica '47' fazendo ?!" ) mas a sintaxe é limpa e esta técnica para fazer uma simples citação é bonita bem conhecido .

awk é o que trata especialmente, não o seu shell. Em ' ' -quadas cadeias, as conchas estilo Bourne como Bash não executam qualquer expansão . C Shells como tcsh do, mas eles não expandem e isso ainda funciona.

Você pode preferir usar 7 em vez de . Ambos funcionam, a menos que seja seguido imediatamente por um dígito octal (0-7). Nesse caso, você deve use 7 para evitar indicar o caracter errado. Observe que, diferentemente de alguns idiomas, o 47 in é octal mesmo sem o primeiro 0 ; veja abaixo.

O que significa ? Por que isso usa quando dessa forma usa 0x27 ?

Isso ocorre porque dois dezesseis fazem quatro oitos.

  • é uma sequência de caracteres octal , por isso é 4 × 8 + 7 × 1 = 39.
  • 0x27 é um literal numérico hexadecimal , por isso é 2 × 16 + 7 × 1 = 39.
    Então o printf ' %c ' especificador formata como um caractere.

A verificação com python -c 'print int("47", 8), int("27", 16)' fornece 39 39 , conforme esperado.

    
por Eliah Kagan 26.09.2017 / 09:45