web-dev-qa-db-fra.com

Comment puis-je échapper aux apostrophes dans une déclaration awk?

J'utilise Ubuntu Linux avec le shell bash. Comment puis-je échapper aux apostrophes dans une déclaration awk? Je veux sortir un peu de SQL, après avoir extrait les données d'un fichier en utilisant awk, donc j'ai:

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

Mais cela n'imprime que:

SELECT * from user where id = ;

Si je modifie ce qui précède pour

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

alors je reçois une déclaration comme

SELECT * from user where id = cf915247dfcf47b6814b5350e5cbdfd8;

mais il n'y a pas de guillemets simples autour de l'identifiant, ce dont j'ai besoin.

4
Dave

Vous voudrez peut-être aborder cette question de deux manières:

  1. Passer un guillemet simple via variable:

    awk -v sq="'" -F',' '{print "SELECT * from user where id = "sq$2sq";"}' myfile.csv
    
  2. Utilisez la valeur hexadécimale de la citation unique dans l'instruction printf:

    awk -F',' '{printf "SELECT * from user where id = %c%s%c;\n",0x27,$2,0x27}' myfile.csv
    
2
Sergiy Kolodyazhnyy

Vous pouvez tilisez simplement \47 (ou \047) dans votre chaîne, ce qui awk signifie '.

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

C'est en quelque sorte inélégant ("Quelle est la répétition valeur magique '47' en faisant ?!") mais la syntaxe est propre et cette technique pour faire un seul devis est jolie - bienconn .

awk est ce qui traite \47 spécialement, pas votre Shell. Dans ''- chaînes citées, les shells de type Bourne ressemblent à Bash n'effectuez pas aucune extension . C Les shell comme tcsh le font, mais ils ne développent pas \47 et cela fonctionne toujours.

Vous préférerez peut-être utiliser \047 au lieu de \47. Ils fonctionnent tous les deux, sauf si \47 est immédiatement suivi de un chiffre octal (0-7), auquel cas vous devez utiliser \047 pour éviter d'indiquer le mauvais caractère. Notez que, contrairement à certaines langues, le 47 dans \47 est octal, même sans le 0 principal; voir ci-dessous.

Que signifie \47? Pourquoi utilise-t-on \47 quand de cette façon utilise 0x27?

C'est parce que deux seize ans font quatre huit.

  • \47 est une séquence de caractères octal , il s'agit donc de 4 × 8 + 7 × 1 = 39.
  • 0x27 est un hexadécimal littéral numérique, il s'agit donc de 2 × 16 + 7 × 1 = 39.
    Alors le spécificateur %c de printf le formate en tant que caractère.

Le contrôle avec python -c 'print int("47", 8), int("27", 16)' donne 39 39, comme prévu.

1
Eliah Kagan

Cela va paraître fou, mais voilà:

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

SELECT * from user where id = 'cf915247dfcf47b6814b5350e5cbdfd8';

J'espère que cela t'aides!

1
Terrance