Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to "unescape" the output of bash's `printf "%q"`

In bash, you can use printf "%q" to escape the special characters in a string. I've added a line break in the following examples for clarity's sake:

$ printf "%q\n" "foo"
foo
$ printf "%q\n" 'foo$bar'
foo\$bar
$ printf "%q\n" "foo    bar"  # Tab entered with Ctrl+V Tab
$'foo\tbar'

You can supply the -v option to printf to stick the output into a variable, rather than echoing to stdout.

Now what if I want to echo the original, unescaped string back to stdout? If I just do a simple echo, it includes all the meta/control characters; echo -e gets me slightly further, but not to a fully unescaped state.

like image 942
Xophmeister Avatar asked Nov 05 '25 07:11

Xophmeister


1 Answers

Use printf and eval to "unescape" the string (it is perfectly safe, since it is quoted by bash already). echo is, in general, dangerous with arbitrary user input.

eval printf '%s\\n' "$var"

The argument to printf is %s\\n with double backslashes even within the single quotes, since eval will take it as one argument and then strip it (evaluate it) as is, so it effectively becomes something like: printf %s\\n $'12\n34 56' which is a perfectly safe and valid command (the variable even includes a newline and space, as you can see).

NOTE: This assumes the input is escaped from printf '%q' or similar, otherwise it is not safe.

like image 80
kktsuri Avatar answered Nov 06 '25 20:11

kktsuri



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!