awk print apostrof / enkele quote

Kan “niet achterhalen hoe ik aan alles kan ontsnappen terwijl ik awk gebruik.

Ik moet elke invoer insluiten string met enkele aanhalingstekens, bijv.

input string1 string2 string3 output "string1" "string2" "string3" 

Ik heb gevochten met ontsnappende " " $0 en al het andere en ik kan het gewoon niet maken het werkt. Ofwel $ 0 wordt direct doorgegeven aan bash, of er gebeurt iets anders.

Reacties

Antwoord

Hier zijn een paar manieren:

  1. gebruik octale escape-reeksen. Op ASCII-gebaseerde systemen waar " is gecodeerd als byte 39 (octaal 047), dat zou zijn:

    awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3" 
  2. geef het citaat door als een variabele

     $ awk -v q=""" "{print q $0 q}" input "string1" "string2" "string3" 

Reacties

  • "\047" is nog nooit bij me opgekomen. Wauw. Bedankt.
  • O r sla je awk-script op in een bestand script.awk om het uit te voeren als awk -f script.awk input en dan kun je gewoon { print "'" $0 "'" } of { printf "'%s'\n", $0 }. Het onvermogen om ' s te gebruiken in een ' -delimited script is een shell-probleem, geen onhandig probleem.
  • Elke ontsnapte octaal van man ascii is goed in awk. Zelfs \000 voor NUL (in GNU / awk maar niet mawk) en \042 voor " .
  • Ik raad aan om # 3 toe te voegen: escape the quote op shell-niveau: awk '{ print "'\''" $0 "'\''" }' input en # 4 gebruiken dubbele aanhalingstekens op shell-niveau: awk "{print \"'\" \$0 \"'\" }" input. Aangezien dit het geaccepteerde antwoord is en al meerdere methoden vermeldt, kan het net zo goed deze alternatieven bevatten.

Antwoord

Zet in awk-code de apostrof gewoon tussen dubbele aanhalingstekens. U kunt strings samenvoegen door ze naast elkaar te plaatsen (juxtapositie), ongeacht hoe deze strings zijn geconstrueerd (letterlijk, variabel, veldverwijzing, uitdrukking tussen haakjes,…).

 { print """ $0 """ }  

Als deze awk-code is opgenomen in een shell-script en de awk-code is in een letterlijke tussen aanhalingstekens, moet u ervoor zorgen dat het enkele aanhalingsteken voor awk. Gebruik single-quote-backslash-single-quote-single-quote "\"" om een enkel aanhalingsteken in een shell met enkele aanhalingstekens.

 awk "{ print ""\""" $0 ""\""" }"  

U kunt ook de awk-code uitdrukken zonder een enkel aanhalingsteken. U kunt een backslash gebruiken gevolgd door drie octale cijfers om een willekeurig teken in een tekenreeks in awk weer te geven. Voor een enkel citaat op ASCII-gebaseerde systemen, dat “s \047.

 awk "{ print "\047" $0 "\047" }"  

Reacties

  • awk '{ print "'\''" $0 "'\''" }' dit is gewoon gek.
  • @ ArtemS.Tashkinov Het ' is ook verreweg de betere oplossing als het gaat om draagbaarheid, en ik zou zeggen dat het begrijpelijker is voor iemand die de shell zo goed kent als zou moeten als ze ' gebruiken shell dan octale escapes. '\'' is iets dat iedereen die shell-scripts doet, moet internaliseren als de manier om aan enkele aanhalingstekens in een shell string met enkele aanhalingstekens, vooral omdat strings met enkele aanhalingstekens de robuuste / draagbare / veiligste manier zijn om te ontsnappen aan willekeurige strings in alle Bourne-achtige shells. Maar je kunt ook de awk-code in een string met dubbele aanhalingstekens plaatsen: awk "{print \"'\" \$0 \"'\" }"

Antwoord

Let op Je hebt daarvoor geen awk nodig.

Je kunt in plaats daarvan het paste basisprogramma gebruiken:

 < input paste -d """ /dev/null - /dev/null 

Het zou efficiënter zijn en minder beperkingen hebben dan awk -gebaseerd of sed -gebaseerde oplossingen.

Answer

De awk-code hoeft alleen

{ print """ $0 """ } 

Je zou dat in een bestand kunnen plaatsen, zodat je niets hoeft te citeren:

$ printf "a\nb\n" | awk -f quote.awk "a" "b" 

Of gebruik een string met dubbele aanhalingstekens, en ontsnap aan de aanhalingstekens en het dollarteken:

$ printf "a\nb\n" | awk "{ print \""\" \$0 \""\" }" 

Of gebruik in Bash / ksh / zsh de $"..." vorm van aanhalingstekens, waarmee u aan het enkele aanhalingsteken kunt ontsnappen:

$ printf "a\nb\n" | awk $"{ print "\"" $0 "\"" }" 

Antwoord

je kunt ook het sed commando gebruiken.

<infile sed -E "s/^|$/"/g" 

of

<infile sed -E "s/.*/"&"/" 

Reacties

  • Of sed -E "s/.*/'&'/" infile.
  • @chepner ja, ik heb dat verplaatst naar antwoord:)

Antwoord

Een manier om de string tussen enkele aanhalingstekens te zetten is via het printf commando gnu xargs:

< file xargs -d"\n" printf ""%s"\n" 

Perl

perl -sple "$_="$q$_$q"" -- -q=\" file 

GNU gebruiken sed:

sed -e "G;H;z;x;y/\n/"/" file 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *