awk print apostrophe / guillemet simple

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

Réponse

Voici quelques moyens:

  1. 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" 
  2. 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 que awk -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 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *