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.
Vous voudrez peut-être aborder cette question de deux manières:
Passer un guillemet simple via variable:
awk -v sq="'" -F',' '{print "SELECT * from user where id = "sq$2sq";"}' myfile.csv
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
\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.
\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.%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.
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!