awk print apostrof / citat simplu

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

Răspuns

Iată câteva moduri:

  1. 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" 
  2. 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 ca awk -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 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *