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.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