awk udskriv apostrof / enkelt citat

Kan ikke finde ud af, hvordan man kan undslippe alt, mens man bruger awk.

Jeg skal vedlægge hver input streng med med enkelt anførselstegn, f.eks.

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

Kæmpet med at flygte " " $0 og alt det andet, og jeg kan bare ikke lave det fungerer. Enten sendes $ 0 til bash direkte, eller der sker noget andet.

Kommentarer

Svar

Her er et par måder:

  1. brug oktale escape-sekvenser. På ASCII-baserede systemer, hvor " er kodet som byte 39 (okt. 047), ville det være:

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

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

Kommentarer

  • "\047" har aldrig kommet mig i tankerne. Wow. Tak.
  • O r gem dit awk-script i en fil script.awk for at udføre som awk -f script.awk input og så kan du bare gøre { print "'" $0 "'" } eller { printf "'%s'\n", $0 }. Manglende evne til at bruge ' s i et ' -afgrænset script er et shellproblem og ikke et problem.
  • Enhver undsluppet oktal fra mand ascii er god i awk. Selv \000 for NUL (i GNU / awk men ikke mawk) og \042 til " .
  • Jeg anbefaler at tilføje nr. 3: undslip citatet på shell-niveau: awk '{ print "'\''" $0 "'\''" }' input og # 4 brug dobbelt anførselstegn på shell-niveau: awk "{print \"'\" \$0 \"'\" }" input. Da dette er det accepterede svar og allerede indeholder flere metoder, kan det lige så godt også omfatte disse alternativer.

Svar

I awk-kode skal du blot placere apostrofen i dobbelt anførselstegn. Du kan sammenkæde strenge ved at placere dem ved siden af hinanden (sidestilling), uanset hvordan disse strenge er konstrueret (bogstavelig, variabel, feltreference, parentes udtryk, …).

 { print """ $0 """ }  

Hvis denne awk-kode er inkluderet i et shell-script, og awk-koden er i en enkelt citeret bogstavelig, skal du arrangere at passere det eneste citat karakter til at awk. Brug single-quote-backslash-single-quote-single-quote "\"" for at inkludere et enkelt citattegn i et enkeltciteret shell bogstaveligt.

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

Alternativt kan du udtrykke awk-koden uden at bruge et enkelt citatkarakter. Du kan bruge et tilbageslag efterfulgt af tre oktale cifre til at repræsentere ethvert tegn i en streng, der er bogstavelig i awk. For et enkelt tilbud på ASCII-baserede systemer skal den “s \047.

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

Kommentarer

  • awk '{ print "'\''" $0 "'\''" }' dette er bare vanvittigt.
  • @ ArtemS.Tashkinov Det ' er også langt den overlegne løsning, når det kommer til bærbarhed, og jeg vil argumentere for, at det er mere forståeligt for nogen, der kender shell så godt som de burde, hvis de ' bruger shell end oktale undslipper. '\'' er noget, som enhver, der laver shell-scripting, skal internalisere som en måde at undslippe enkelte citater i en enkelt citeret skalstreng, især fordi enkelt citerede strenge er den robuste / bærbare / sikreste måde at undslippe vilkårlige strenge i alle Bourne-lignende skaller. Men alternativt kan du sætte awk-koden i en dobbelt citeret streng: awk "{print \"'\" \$0 \"'\" }"

Svar

Bemærk tha t har du ikke brug for awk til det.

Du kan bruge paste grundlæggende hjælpeprogram i stedet:

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

Det ville være mere effektivt og have færre begrænsninger end awk -baseret eller sed -baserede løsninger.

Svar

Awk-koden skal bare være

{ print """ $0 """ } 

Du kan sætte det i en fil, så du behøver ikke citere noget:

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

Eller brug en streng med dobbelt citater og undslip citaterne og dollartegnet:

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

Eller i Bash / ksh / zsh, brug $"..." form for citater, som giver dig mulighed for at undslippe det enkelte citat inde:

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

Svar

kan du også bruge kommandoen sed.

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

eller

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

Kommentarer

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

Svar

En måde at omslutte strengen i enkelte citater er via printf-kommandoen gnu xargs:

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

Perl

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

Brug af GNU sed:

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *