On Mon, Oct 31, 2016 at 9:20 PM, Jeff Adamson <jwadam...@us.ibm.com> wrote: > > We will give this more thought. Ant only needs one replacement engine to work > on all platforms, but I don't know of a specific reason that nawk should not > be just as capable as sed. > > To summarize, > > Using 4-backslash replacement nawk on ubuntu: > > arg : -Dfoo=dollar$_backtick`_single'_double"_trailingbackslash\ > quoted_arg: "-Dfoo=dollar\$_backtick\`_single'_double\"_trailingbackslash\\" > .... > [echo] foo=dollar$_backtick`_single'_double"_trailingbackslash\_ > > Using 8-backslash replacement nawk on ubuntu: > > arg : -Dfoo=dollar$_backtick`_single'_double"_trailingbackslash\ > quoted_arg: "-Dfoo=dollar\$_backtick\`_single'_double\"_trailingbackslash\\\\" > .... > [echo] foo=dollar$_backtick`_single'_double"_trailingbackslash\\_ > > Using 4-backslash replacement nawk(?) on your machine: > > arg : -Dfoo=trail\ingbackslash\ > quoted_arg: "-Dfoo=trail\ingbackslash\" > .... > error output (clearly failed to double the backslash during quoting) > > Using 8-backslash replacement nawk on your machine: > > arg : -Dfoo=trail\ingbackslash\ > quoted_arg: "-Dfoo=trail\\ingbackslash\\" > ... > arg : -Dfoo=trail\ingbackslash\ > quoted_arg: "-Dfoo=trail\\ingbackslash\\" > > > The goal of the line is to replace one backslash literal with two. The other > awk patterns are correctly replacing with two backslashes in the replacement > pattern; introducing a single new backslash literal in the output. Not sure > why this backslash should be different. I think 4-backslash is the correct > number unless something is doing an extra pass of interpretation of the > argument. > > > Maybe the slash-string pattern is being interpreted differently. Can we try > it as just plain double-quote strings? > > 'awk') > esc_arg="$(printf '%s' "$esc_arg" | "$awk_exec" '{ gsub("\\\\", "\\\\"); > print }' )" > esc_arg="$(printf '%s' "$esc_arg" | "$awk_exec" '{ gsub("\\$", "\\$"); print > }' )" > esc_arg="$(printf '%s' "$esc_arg" | "$awk_exec" '{ gsub("\"", "\\\""); print > }' )" > esc_arg="$(printf '%s' "$esc_arg" | "$awk_exec" '{ gsub("`", "\\`"); print }' > )"
I'm afraid that doesn't work either: [[ bash-4.1> diff ant.new ant.new.edited 63,66c63,66 < esc_arg="$(printf '%s' "$esc_arg" | "$awk_exec" '{ gsub(/\\/, "\\\\"); print }' )" < esc_arg="$(printf '%s' "$esc_arg" | "$awk_exec" '{ gsub(/\$/, "\\$"); print }' )" < esc_arg="$(printf '%s' "$esc_arg" | "$awk_exec" '{ gsub(/\"/, "\\\""); print }' )" < esc_arg="$(printf '%s' "$esc_arg" | "$awk_exec" '{ gsub(/`/, "\\`"); print }' )" --- > esc_arg="$(printf '%s' "$esc_arg" | "$awk_exec" '{ gsub("\\\\", > "\\\\"); print }' )" > esc_arg="$(printf '%s' "$esc_arg" | "$awk_exec" '{ gsub("\\$", > "\\$"); print }' )" > esc_arg="$(printf '%s' "$esc_arg" | "$awk_exec" '{ gsub("\"", > "\\\""); print }' )" > esc_arg="$(printf '%s' "$esc_arg" | "$awk_exec" '{ gsub("`", "\\`"); > print }' )" bash-4.1> ./ant.new.edited --execdebug "-Dfoo=trail\\ingbackslash\\" -f test.xml arg : -Dfoo=trail\ingbackslash\ quoted_arg: "-Dfoo=trail\ingbackslash\" arg : -f quoted_arg: "-f" arg : test.xml quoted_arg: "test.xml" exec "$JAVACMD" -Xmx512m -Djava.awt.headless=true -XX:MaxPermSize=140m -classpath "$LOCALCLASSPATH" -Dant.home="$ANT_HOME" -Dant.library.dir="$ANT_LIB" org.apache.tools.ant.launch.Launcher -cp "$CLASSPATH" "-Dfoo=trail\ingbackslash\" "-f" "test.xml" Buildfile: build.xml does not exist! Build failed ]] I think it would indeed be better to focus on 'sed' only now, because we can get it to work well cross-platform. No need to make it also work with (n)awk. -- Johan --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@ant.apache.org For additional commands, e-mail: dev-h...@ant.apache.org