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
- Samanlainen kysymys pääkäyttäjältä .
Vastaa
Tässä on muutama tapa:
-
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" -
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.awksuoritettavaksi nimelläawk -f script.awk inputja 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
\000NUL: lle (GNU / awk, mutta ei mawk) ja\042". - Suosittelen lisäämään # 3: paeta tarjous kuoritasolla:
awk '{ print "'\''" $0 "'\''" }' inputja # 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