awk print apostrophe / single quote

Kan ikke finne ut hvordan jeg kan unnslippe alt mens jeg bruker awk.

Jeg må legge ved hver inngang streng med med enkelt anførselstegn, f.eks.

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

Kjempet med å rømme " " $0 og alt annet, og jeg kan bare ikke lage det fungerer. Enten blir $ 0 sendt til bash direkte, eller noe annet skjer.

Kommentarer

Svar

Her er et par måter:

  1. bruk oktale rømningssekvenser. På ASCII-baserte systemer der " er kodet som byte 39 (oktal 047), vil det være:

    awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3" 
  2. send sitatet som en variabel

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

Kommentarer

  • "\047" har aldri kommet meg i tankene. Wow. Takk.
  • O r lagre awk-skriptet ditt i en fil script.awk for å utføre som awk -f script.awk input og så kan du bare gjøre { print "'" $0 "'" } eller { printf "'%s'\n", $0 }. Manglende evne til å bruke ' s i et ' -avgrenset skript er et skallproblem, ikke et problem.
  • Enhver rømt oktal fra mennesket ascii er bra i vanskeligheter. Selv \000 for NUL (i GNU / awk men ikke mawk) og \042 for " .
  • Jeg anbefaler å legge til nr. 3: unnslipp sitatet på skallnivå: awk '{ print "'\''" $0 "'\''" }' input og # 4 bruker doble anførselstegn på skallnivå: awk "{print \"'\" \$0 \"'\" }" input. Siden dette er det aksepterte svaret og allerede inneholder flere metoder, kan det like godt også inkludere disse alternativene.

Svar

I awk-kode setter du bare apostrofen i doble anførselstegn. Du kan sammenkoble strenger ved å plassere dem ved siden av hverandre (sidestilling), uansett hvordan disse strengene er konstruert (bokstavelig, variabel, feltreferanse, parentesuttrykk, …).

 { print """ $0 """ }  

Hvis denne awk-koden er inkludert i et skallskript og awk-koden er i en enkelt sitert bokstav, må du ordne å passere det enkle sitattegnet for å kjipe. Bruk single-quote-backslash-single-quote-single-quote "\"" for å inkludere et enkelt sitattegn i et enkelt sitert skall bokstavelig.

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

Alternativt kan du uttrykke awk-koden uten å bruke et enkelt sitatkarakter. Du kan bruke en tilbakeslag skrått etterfulgt av tre oktale sifre for å representere et hvilket som helst tegn i en streng bokstavelig i awk. For et enkelt tilbud på ASCII-baserte systemer, at «s \047.

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

Kommentarer

  • awk '{ print "'\''" $0 "'\''" }' dette er bare gal.
  • @ ArtemS.Tashkinov Det ' er også den overlegne løsningen når det gjelder bærbarhet, og jeg vil hevde at det er mer forståelig for noen som kjenner skall så godt som de burde hvis de ' bruker shell enn oktale rømninger. '\'' er noe alle som gjør shell-skripting bør internalisere som måten å unnslippe enkelt anførselstegn i enkelt sitert skallstreng, spesielt fordi enkelt siterte strenger er den robuste / bærbare / sikreste måten å unnslippe vilkårlige strenger i alle Bourne-lignende skjell. Men alternativt kan du sette awk-koden i en dobbel sitert streng: awk "{print \"'\" \$0 \"'\" }"

Svar

Merk deg t du ikke trenger «div id =» c4d73ca63c «>

for det.

Du kan bruke paste grunnleggende verktøy i stedet:

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

Det ville være mer effektivt og ha færre begrensninger enn awk -basert eller sed -baserte løsninger.

Svar

Awk-koden trenger bare å være

{ print """ $0 """ } 

Du kan legge det inn i en fil, så du trenger ikke å sitere noe:

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

Eller bruk en dobbel sitert streng, og unnslipp anførselstegnene og dollartegnet:

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

Eller i Bash / ksh / zsh, bruk $"..." form for anførselstegn, som lar deg unnslippe det eneste sitatet inne:

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

Svar

du kan også bruke kommandoen sed.

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

eller

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

Kommentarer

  • Eller sed -E "s/.*/'&'/" infile.
  • @chepner ja, jeg flyttet det til svar 🙂

Svar

En måte å omslutte strengen i enkelt anførselstegn er via printf-kommandoen gnu xargs:

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

Perl

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

Bruker GNU sed:

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *