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
- Lignende spørgsmål til superbruger .
Svar
Her er et par måder:
-
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"
-
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 somawk -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