Search code examples
bashsedquoting

How can I do ANSI C quoting of an existing bash variable?


I have looked at this question, but it does not cover my use case.

Suppose I have the variable foo which holds the four-character literal \x60.

I want to perform ANSI C Quoting on the contents of this variable and store it into another variable bar.

I tried the following, but none of them achieved the desired effect.

bar=$'$foo'   
echo $bar     
bar=$"$foo"     
echo $bar       

Output:

$foo
\x61

Desired output (actual value of \x61):

a

How might I achieve this in the general case, including non-printable characters? Note that in this case a was used just as an example to make it easier to test whether the method worked.


Solution

  • By far the simplest solution, if you are using bash:

    printf %b "$foo"
    

    Or, to save it in another variable name bar:

    printf -v bar %b "$foo"
    

    From help printf:

    In addition to the standard format specifications described in printf(1) and printf(3), printf interprets:

     %b        expand backslash escape sequences in the corresponding argument
     %q        quote the argument in a way that can be reused as shell input
     %(fmt)T output the date-time string resulting from using FMT as a format
             string for strftime(3)
    

    There are edge cases, though:

    \c terminates output, backslashes in \', \", and \? are not removed, and octal escapes beginning with \0 may contain up to four digits