Want to convert this:
abc "a\"bc$xyz$abc$x$y" $bla'h, $blah hello k\$nob this is "\"'abc$xy$z\"" test "$" a$$bc "$$abc$xyz$abc$" blah, $$, blah
to:
abc "a\"bc\$xyz\$abc\$x\$y" $bla'h, $blah hello k\$nob this is "\"'abc\$xy\$z\"" test "\$" a$$bc "\$\$abc\$xyz\$abc\$" blah, $$, blah
That is, escape (with \) all $ but only if they occur inside double-quoted strings. Here is my attempt:
my $str = <<'EOS'; abc "a\"bc$xyz$abc$x$y" $bla'h, $blah hello k\$nob this is "\"'abc$xy$z\"" test "$" a$$bc "$$abc$xyz$abc$" blah, $$, blah EOS print "$str\n\n"; # $qq matches a double quoted string. my $qq = qr/"[^"\\]*(?:\\.[^"\\]*)*"/; # Break $str into fields (quoted or unquoted). my @fields = $str =~ /$qq|[^"]+/g; # Escape $ in quoted fields only. /^"/ && s/\$/\\\$/g for @fields; print @fields;
Improvements/alternative approaches welcome.
In reply to Escape $ inside quotes only by eyepopslikeamosquito
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |