Hallo, Am Fri, 29 May 2015, Daniel Spannbauer schrieb:
ich versuche gerade folgendes mit gawk innerhalb eines Shell-Scriptes zu lösen:
echo | gawk '{ out = "xxx"; print "('" out "'),"; ^ hier beendest du die äußeren '', die den awk-Befehl umschließen.
Erwarten (bzw. erreichen) würde ich folgendes: ('xxx'),
Effektiv wirds aber: ( out ),
Wie üblich hilft 'set -x' beim Verständnis. $ set -x $ gawk 'BEGIN { out = "xxx"; print "('" out "')"};' + gawk 'BEGIN { out = "xxx"; print "( out )"};' ( out )
Noch lustiger wirds wenn ich es aus nem Shell-Skript raus ausführe Zum testen das ganze in xxx.sh eintragen uns ausführen.
Ich quote mich jetzt schon ne ganze Weile zu Tode, hingekriegt habe ichs nicht.
Ist auch nervig, wenn man das so mit den '' macht: gawk 'BEGIN{ out = "xxx"; print "('"'"'" out "'"'"')";}' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^ [1] ^^^ ^^^ [2] [1] markiert die Bereiche, in denen die '' die für die shell gelten. [2] hier maskieren die "" das ' für die shell. $ gawk 'BEGIN{ out = "xxx"; print "('"'"'" out "'"'"')";}' + gawk 'BEGIN{ out = "xxx"; print "('\''" out "'\'')";}' ('xxx') Statt bei [2] jew. "'" zu nehmen geht also auch \' aber eben auf Shell-Ebene, nicht _im_ gawk. Anders geschrieben: gawk shell 'BEGIN{ out = "xxx"; print "(' awk-Argument=BEGIN{ ..."( "'" shell -> awk-Argument=' '" out "' awk-Argument=" out " "'" shell -> awk-Argument=' ')";}' awk-Argument=)";} bzw. dein Original: gawk 'BEGIN { out = "xxx"; print "(' awk-Argument=BEGIN{..."( " out " shell -> awk-Argument=\ out \ ')"};' awk-Argument=)"}; Lesbarer wird das ganze, wenn du außen "" nimmst, denn die " lassen sich innen relativ lesbar escapen: $ gawk "BEGIN{ out = \"xxx\"; print \"('\" out \"')\";}" + gawk 'BEGIN{ out = "xxx"; print "('\''" out "'\'')";}' ('xxx') oder besser: $ gawk "BEGIN{ out = \"xxx\"; printf(\"('%s')\n\", out);}" + gawk 'BEGIN{ out = "xxx"; printf("('\''%s'\'')\n", out);}' ('xxx') oder du schreibst das ganze in ne Datei: $ cat tmp.awk out = "xxx"; print "('" out "')"; $ echo | gawk -f tmp.awk ('xxx') oder auch via stdin, wenn man das nicht anderweitig braucht: $ cat<<'EOF'|gawk -f- BEGIN{ out = "xxx"; print "('" out "')";} EOF Auch hier geht wieder 'printf' statt print. HTH, -dnh -- Gib einem Hungrigen einen Fisch, und er ist fuer einen Tag satt. Zeig ihm, wie man angelt, und er poebelt Dich an, dass er besseres zu tun haette, als Schnuere ins Wasser haengen zu lassen. -- David Kastrup in de.comp.text.tex -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org