Nem tudom kitalálni, hogyan kerüljünk el mindent az awk használata közben.
Minden egyes bemenetet mellékelnem kell karaktersorozat egyetlen idézőjelekkel, pl.
input string1 string2 string3 output "string1" "string2" "string3"
Harcolt a szökéssel " " $0
és minden mással, és egyszerűen nem tudok vagy működik. Vagy $ 0-t adnak át közvetlenül a bash-nak, vagy valami más történik.
Megjegyzések
- Hasonló kérdés a szuperfelhasználóval .
Válasz
Íme néhány módszer:
-
használjon oktális menekülési szekvenciákat. Azokban az ASCII-alapú rendszerekben, ahol a
"
39-es bájtként van kódolva (047. oktális), ez a következő lenne:awk "{print "\047" $0 "\047"}" input "string1" "string2" "string3"
-
adja át az idézetet változóként
$ awk -v q=""" "{print q $0 q}" input "string1" "string2" "string3"
Megjegyzések
-
"\047"
soha nem fordult meg a fejemben. Ejha. > - O r mentsd el az awk parancsfájlt egy
script.awk
fájlba, hogyawk -f script.awk input
néven hajtsd végre, és akkor egyszerűen megteheted / div> vagy{ printf "'%s'\n", $0 }
. A'
s használatának képtelensége egy'
-határolt szkriptben nem shell, hanem awk probléma. - A man ascii elől minden szökött oktál jó az awk-ban. Még
\000
NUL esetén (GNU / awk-ban, de nem mawk) és\042
esetén"
. - Javaslom a # 3 hozzáadását: az idézet elkerülése a shell szintjén:
awk '{ print "'\''" $0 "'\''" }' input
és a # 4 kettős idézőjeleket használjon a shell szintjén:awk "{print \"'\" \$0 \"'\" }" input
. Mivel ez az elfogadott válasz, és már több módszert is felsorol, az is tartalmazhatja ezeket az alternatívákat.
Válasz
Az awk kódban csak írja be az aposztrófot dupla idézőjelek közé. A sztringeket összefűzheti úgy, hogy egymás mellé helyezi őket (egymás mellé helyezése), függetlenül attól, hogy ezek a karaktersorok hogyan épülnek fel (szó szerinti, változó, mező hivatkozás, zárójeles kifejezés, stb.).
{ print """ $0 """ }
Ha ezt az awk kódot egy shell szkript tartalmazza, és az awk kód egy idézőjelű literálban van, akkor gondoskodnia kell az átadásról az egyetlen idézet karakter az awk-ra. Használjon egy-idézet-visszavonás-egyetlen-idézet-egyetlen-idézet "\""
elemet egyetlen idézet karakter beillesztéséhez egy egyetlen idézőjelű shell literal.
awk "{ print ""\""" $0 ""\""" }"
Alternatív megoldásként kifejezheti az awk kódot anélkül, hogy egyetlen idézet karakter. Használhat visszavonást, amelyet három oktális számjegy követ, az awk karakterlánc bármely karakterének ábrázolására. Az ASCII alapú rendszerek egyetlen árajánlatához “s \047
.
awk "{ print "\047" $0 "\047" }"
Megjegyzések
-
awk '{ print "'\''" $0 "'\''" }'
ez csak őrült. - @ ArtemS.Tashkinov Ez ' is messze a legjobb megoldás, ha a hordozhatóságról van szó, és azt állítom, érthetőbb annak, aki olyan jól ismeri a shell-t, mint ha kellene ' héjat használnak, mint az oktális menekülés. egyetlen idézett héj karakterlánc, különösen azért, mert az egyetlen idézett karakterláncok a robusztus / hordozható / legbiztonságosabb módja az önkényes karakterláncok elkerülésének az összes Bourne-szerű héjban. De alternatív megoldásként az awk kódot kettős idézett karakterláncba is be lehet tenni:
awk "{print \"'\" \$0 \"'\" }"
Válasz
Megjegyzés: tha t ehhez nem kell awk
.
Helyette használhatja a paste
alapeszközöket:
< input paste -d """ /dev/null - /dev/null
Hatékonyabb és kevesebb korlátozás lenne, mint a awk
alapú vagy sed
alapú megoldások.
Válasz
Az awk kódnak csak a következőnek kell lennie:
{ print """ $0 """ }
Ezt beteheti egy fájlba, így nem kell semmit idéznie:
$ printf "a\nb\n" | awk -f quote.awk "a" "b"
Vagy használja dupla idézőjelű karakterlánc, és kerülje az idézőjeleket és a dollárjelet:
$ printf "a\nb\n" | awk "{ print \""\" \$0 \""\" }"
Vagy a Bash / ksh / zsh fájlban használja a $"..."
idézőjelek, amelyek lehetővé teszik, hogy elkerülje a benne lévő egyetlen idézetet:
$ printf "a\nb\n" | awk $"{ print "\"" $0 "\"" }"
Válasz
használhatja az sed
parancsot is.
<infile sed -E "s/^|$/"/g"
vagy
<infile sed -E "s/.*/"&"/"
Megjegyzések
- Vagy
sed -E "s/.*/'&'/" infile
. - @chepner igen, ezt áthelyeztem a válaszba:)
Válasz
Egy A karakterlánc egyetlen idézőjelbe foglalása a printf gnu xargs paranccsal lehetséges:
< file xargs -d"\n" printf ""%s"\n"
Perl
perl -sple "$_="$q$_$q"" -- -q=\" file
A GNU sed használata:
sed -e "G;H;z;x;y/\n/"/" file