awk tulosta apostrofi / yksittäinen lainaus

Ei voi selvittää, miten pakenee kaikesta käyttäessäsi awk-ohjelmaa. merkkijono yksittäisillä lainausmerkeillä, esim.

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

Taistellut pakenemisen " " $0 ja kaiken muun kanssa, enkä voi tehdä se toimii. Joko $ 0 välitetään suoraan bashille, tai tapahtuu jotain muuta.

Kommentit

Vastaa

Tässä on muutama tapa:

  1. käytä oktaalisia pakosarjoja. ASCII-pohjaisissa järjestelmissä, joissa " on koodattu tavuksi 39 (oktaali 047), se olisi:

    awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3" 
  2. välitä lainaus muuttujana

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

Kommentit

  • "\047" ei ole koskaan tullut mieleeni. Vau. Kiitos.
  • O r tallenna awk-komentosarjasi tiedostoon script.awk suoritettavaksi nimellä awk -f script.awk input ja voit sitten tehdä vain { print "'" $0 "'" } tai { printf "'%s'\n", $0 }. Kyvyttömyys käyttää ' s-tiedostoja ' -erityisessä komentosarjassa on shell-ongelma, ei awk-ongelma.
  • Kaikki man ascii: sta paenneet oktaalit ovat hyvät awk-tilassa. Jopa \000 NUL: lle (GNU / awk, mutta ei mawk) ja \042 " .
  • Suosittelen lisäämään # 3: paeta tarjous kuoritasolla: awk '{ print "'\''" $0 "'\''" }' input ja # 4 käytä kaksoislainauksia kuoritasolla: awk "{print \"'\" \$0 \"'\" }" input. Koska tämä on hyväksytty vastaus ja siinä luetellaan jo useita menetelmiä, se voi myös sisältää nämä vaihtoehdot.

Vastaa

Lisää awost-koodi awk-koodiin kaksoislainausmerkkeihin. Voit ketjuttaa merkkijonoja asettamalla ne vierekkäin (rinnakkaisuus) riippumatta siitä, miten nämä merkkijonot on rakennettu (kirjaimellinen, muuttuja, kenttäviite, sulutettu lauseke jne.).

 { print """ $0 """ }  

Jos tämä awk-koodi sisältyy shell-komentosarjaan ja awk-koodi on yhden lainausmerkin kirjaimessa, sinun on järjestettävä välittäminen yhden lainausmerkin awk. Käytä yhden lainausmerkin taaksepäin vinoviivaa, yksi lainaus, yksi lainaus "\"" , kun haluat sisällyttää yhden lainausmerkin yhden lainauksen sisältävä kuoren literaali.

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

Vaihtoehtoisesti voit ilmaista awk-koodin käyttämättä yksi lainausmerkki. Voit käyttää taaksepäin vinoviivaa ja kolmea oktaalinumeroa edustamaan mitä tahansa merkkiä merkkijonon kirjaimessa awk-muodossa. Jos kyseessä on yksi ASCII-pohjaisten järjestelmien tarjous, tämä ”s \047.

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

kommentit

  • awk '{ print "'\''" $0 "'\''" }' tämä on vain hullua.
  • @ ArtemS.Tashkinov Se ' on myös ylivoimaisesti parempi ratkaisu siirrettävyyden suhteen, ja väitän, että se on ymmärrettävämpi jollekin, joka tuntee kuoren yhtä hyvin kuin heidän pitäisi, jos ne ' käyttävät komentotulkkia kuin oktaalipakot. '\'' on jokaisen, joka tekee komentosarjan komentosarjan, sisäistettävä tapa välttää yksittäisiä lainauksia yksi lainausmerkkijono, varsinkin koska yksittäiset lainausmerkkijonot ovat vankka / kannettava / turvallisin tapa välttää mielivaltaisia merkkijonoja kaikissa Bournen kaltaisissa kuorissa. Mutta vaihtoehtoisesti voit laittaa awk-koodin kaksoislainausmerkkijonoon: awk "{print \"'\" \$0 \"'\" }"

Vastaa

Huomaa tha t sinun ei tarvitse awk sitä varten.

Voit käyttää paste -apuohjelmaa sen sijaan:

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

Se olisi tehokkaampaa ja sillä olisi vähemmän rajoituksia kuin awk -pohjaisella tai sed -pohjaiset ratkaisut.

Vastaus

awk-koodin täytyy olla vain

{ print """ $0 """ } 

Voit laittaa sen tiedostoon, joten sinun ei tarvitse lainata mitään:

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

Tai käytä kaksoislainausmerkkijono ja vältä lainausmerkit ja dollarin merkki:

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

Tai käytä Bash / ksh / zsh-tiedostossa $"..." lainausmuodot, joiden avulla voit välttää yksittäisen lainauksen sisällä:

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

vastaus

voit käyttää myös sed -komentoa.

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

tai

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

Kommentit

  • Tai sed -E "s/.*/'&'/" infile.
  • @chepner kyllä, muutin sen vastaukseen:)

vastaus

Yksi tapa merkitä merkkijono yksittäisissä lainausmerkeissä on printf-komento gnu xargs:

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

Perl

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

GNU sed: n käyttö:

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *