Je ne peux pas comprendre comment tout échapper en utilisant awk.
Je dois inclure chaque entrée chaîne avec des guillemets simples, par exemple
input string1 string2 string3 output "string1" "string2" "string3"
Je me suis battu pour méchapper " " $0
et tout le reste et je ne peux tout simplement pas faire ça marche. Soit $ 0 est passé directement à bash, soit quelque chose dautre se produit.
Commentaires
- Question similaire sur le super-utilisateur .
Réponse
Voici quelques moyens:
-
utilise des séquences déchappement octales. Sur les systèmes ASCII où
"
est codé en octet 39 (octal 047), ce serait:awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3"
-
transmettez la citation comme variable
$ awk -v q=""" "{print q $0 q}" input "string1" "string2" "string3"
Commentaires
-
"\047"
ne ma jamais traversé lesprit. Wow. Merci. - O r enregistrez votre script awk dans un fichier
script.awk
pour lexécuter en tant queawk -f script.awk input
et ensuite vous pouvez simplement faire{ print "'" $0 "'" }
ou{ printf "'%s'\n", $0 }
. Lincapacité dutiliser des'
s dans un script délimité'
est un problème de shell, pas un problème awk. - Tout octal échappé de man ascii est bon en awk. Même
\000
pour NUL (dans GNU / awk mais pas mawk) et\042
pour"
. - Je recommande dajouter # 3: échapper à la citation au niveau du shell:
awk '{ print "'\''" $0 "'\''" }' input
et # 4 utiliser des guillemets doubles au niveau du shell:awk "{print \"'\" \$0 \"'\" }" input
. Comme il sagit de la réponse acceptée et quelle répertorie déjà plusieurs méthodes, elle pourrait également inclure ces alternatives.
Réponse
Dans le code awk, mettez simplement lapostrophe entre guillemets. Vous pouvez concaténer des chaînes en les mettant lune à côté de lautre (juxtaposition), quelle que soit la manière dont ces chaînes sont construites (littéral, variable, référence de champ, expression entre parenthèses,…).
{ print """ $0 """ }
Si ce code awk est inclus dans un script shell et que le code awk est dans un littéral entre guillemets simples, vous devez vous arranger pour passer le caractère guillemet simple à awk. Utilisez single-quote-backslash-single-quote-single-quote "\""
pour inclure un guillemet simple dans un littéral shell entre guillemets simples.
awk "{ print ""\""" $0 ""\""" }"
Vous pouvez également exprimer le code awk sans utiliser un caractère guillemet simple. Vous pouvez utiliser une barre oblique inverse suivie de trois chiffres octaux pour représenter nimporte quel caractère dans une chaîne littérale dans awk. Pour un guillemet simple sur les systèmes ASCII, cest « s \047
.
awk "{ print "\047" $0 "\047" }"
Commentaires
-
awk '{ print "'\''" $0 "'\''" }'
cest juste fou. - @ ArtemS.Tashkinov Il ' est également de loin la solution supérieure en matière de portabilité, et je dirais que cest plus compréhensible pour quelquun qui connaît Shell aussi bien quil le devrait si ils ' utilisent le shell plutôt que les échappements octaux.
'\''
est quelque chose que quiconque fait des scripts shell devrait intérioriser comme moyen déchapper les guillemets simples dans un chaîne shell à guillemets simples, en particulier parce que les chaînes entre guillemets simples sont le moyen robuste / portable / le plus sûr pour échapper des chaînes arbitraires dans tous les shells de type Bourne. Mais vous pouvez également mettre le code awk dans une chaîne entre guillemets doubles:awk "{print \"'\" \$0 \"'\" }"
Réponse
Notez que t vous navez pas besoin de awk
pour cela.
Vous pouvez utiliser lutilitaire de base paste
à la place:
< input paste -d """ /dev/null - /dev/null
Ce serait plus efficace et comporterait moins de limitations que awk
ou sed
.
Réponse
Le code awk doit juste être
{ print """ $0 """ }
Vous pouvez mettre cela dans un fichier, vous navez donc pas besoin de citer quoi que ce soit:
$ printf "a\nb\n" | awk -f quote.awk "a" "b"
Ou utilisez une chaîne entre guillemets, et échapper les guillemets et le signe dollar:
$ printf "a\nb\n" | awk "{ print \""\" \$0 \""\" }"
Ou dans Bash / ksh / zsh, utilisez le $"..."
forme de guillemets, qui vous permet déchapper au guillemet simple à lintérieur:
$ printf "a\nb\n" | awk $"{ print "\"" $0 "\"" }"
Réponse
vous pouvez également utiliser la commande sed
.
<infile sed -E "s/^|$/"/g"
ou
<infile sed -E "s/.*/"&"/"
Commentaires
- Ou
sed -E "s/.*/'&'/" infile
. - @chepner oui, je lai déplacé dans la réponse:)
Réponse
Un la façon de mettre la chaîne entre guillemets simples est via la commande printf gnu xargs:
< file xargs -d"\n" printf ""%s"\n"
Perl
perl -sple "$_="$q$_$q"" -- -q=\" file
Utilisation de GNU sed:
sed -e "G;H;z;x;y/\n/"/" file