Nu pot să dau seama cum să scap totul în timp ce folosești awk.
Trebuie să atașez fiecare intrare șir cu ghilimele simple, de ex.
input string1 string2 string3 output "string1" "string2" "string3"
M-am luptat cu evadarea " " $0
și orice altceva și pur și simplu nu pot face funcționează. Fie 0 $ este trecut direct la bash, fie se întâmplă altceva.
Comentarii
- Întrebare similară cu Super User .
Răspuns
Iată câteva moduri:
-
utilizează secvențe de scăpare octale. Pe sistemele bazate pe ASCII unde
"
este codificat ca octet 39 (octal 047), acesta ar fi:awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3"
-
transmiteți citatul ca variabilă
$ awk -v q=""" "{print q $0 q}" input "string1" "string2" "string3"
Comentarii
-
"\047"
nu mi-a trecut niciodată prin minte. Uau. Mulțumesc. - O r salvați scriptul awk într-un fișier
script.awk
pentru a executa caawk -f script.awk input
și apoi puteți face doar{ print "'" $0 "'" }
sau{ printf "'%s'\n", $0 }
. Incapacitatea de a utiliza'
s într-un script'
este o problemă de shell, nu o problemă awk. - Orice octal scăpat de la om ascii este bun în awk. Chiar și
\000
pentru NUL (în GNU / awk dar nu mawk) și\042
pentru"
. - Vă recomandăm să adăugați # 3: scăpați citatul la nivelul shell-ului:
awk '{ print "'\''" $0 "'\''" }' input
și # 4 folosiți ghilimele duble la nivelul shell-ului:awk "{print \"'\" \$0 \"'\" }" input
. Deoarece acesta este răspunsul acceptat și listează deja mai multe metode, ar putea include și acele alternative.
Răspuns
În codul awk, puneți apostroful în ghilimele duble. Puteți concatena șiruri punându-le unul lângă celălalt (juxtapunere), indiferent de modul în care sunt construite aceste șiruri (literal, variabil, referință de câmp, expresie parantezată, …).
{ print """ $0 """ }
Dacă acest cod awk este inclus într-un script shell și codul awk este într-un literal cu ghilimele unice, trebuie să aranjați să treceți caracterul de citat unic care să fie awk. Utilizați o ghilimelă-inversă-o-ghilimelă-unică-ghilimelă "\""
pentru a include un caracter de ghilimelă într-un literal shell shell citat.
awk "{ print ""\""" $0 ""\""" }"
Alternativ, exprimați codul awk fără a utiliza un singur caracter de citat. Puteți utiliza o bară inversă urmată de trei cifre octale pentru a reprezenta orice caracter dintr-un șir literal în awk. Pentru o singură ofertă pe sisteme bazate pe ASCII, că „s \047
.
awk "{ print "\047" $0 "\047" }"
Comentarii
-
awk '{ print "'\''" $0 "'\''" }'
este o nebunie. - @ ArtemS.Tashkinov ' este, de asemenea, de departe soluția superioară atunci când vine vorba de portabilitate și aș argumenta că este mai ușor de înțeles pentru cineva care cunoaște shell-ul la fel de bine ca și cum ar trebui dacă ei ' re folosesc shell-urile decât scăpările octale.
'\''
este ceva ce oricine face scripturi shell ar trebui să-l interiorizeze ca modalitate de a scăpa de ghilimele într-un șir de coajă citat simplu, mai ales că șirurile de citate simple sunt cel robust / portabil / cel mai sigur mod de a scăpa de șiruri arbitrare în toate shell-urile Bourne. Dar, alternativ, puteți pune codul awk într-un șir de cote dublu:awk "{print \"'\" \$0 \"'\" }"
Răspuns
Notă tha Nu aveți nevoie de awk
pentru asta.
Puteți utiliza utilitarul de bază paste
:
< input paste -d """ /dev/null - /dev/null
Ar fi mai eficient și ar avea mai puține limitări decât awk
sau sed
soluții bazate pe.
Răspuns
Codul awk trebuie doar să fie
{ print """ $0 """ }
Ați putea pune acest lucru într-un fișier, deci nu trebuie să citați nimic:
$ printf "a\nb\n" | awk -f quote.awk "a" "b"
Sau utilizați un șir de ghilimele dublu și scăpați de ghilimele și semnul dolar:
$ printf "a\nb\n" | awk "{ print \""\" \$0 \""\" }"
Sau în Bash / ksh / zsh, utilizați $"..."
formă de ghilimele, care vă permit să scăpați de ghilimelele din interior:
$ printf "a\nb\n" | awk $"{ print "\"" $0 "\"" }"
Răspuns
puteți utiliza și comanda sed
.
<infile sed -E "s/^|$/"/g"
sau
<infile sed -E "s/.*/"&"/"
Comentarii
- Sau
sed -E "s/.*/'&'/" infile
. - @chepner da, am mutat asta în răspuns:)
Răspuns
One modalitatea de a înroba șirul între ghilimele este prin comanda printf gnu xargs:
< file xargs -d"\n" printf ""%s"\n"
Perl
perl -sple "$_="$q$_$q"" -- -q=\" file
Utilizarea GNU sed:
sed -e "G;H;z;x;y/\n/"/" file