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
- Lignende spørsmål om superbruker .
Svar
Her er et par måter:
-
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"
-
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 somawk -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