如何对现有的bash变量进行ANSI C引用?

时间:2014-04-23 05:39:23

标签: bash sed quoting

我看过this question,但它不包括我的用例。

假设我有变量foo,它包含四个字符的文字\x60

我想对此变量的内容执行ANSI C Quoting并将其存储到另一个变量bar中。

我尝试了以下方法,但没有一个达到预期的效果。

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

输出:

$foo
\x61

所需输出(\x61的实际值):

a

如何在一般情况下实现此目的,包括不可打印的字符?请注意,在这种情况下,a仅用作示例,以便更轻松地测试方法是否有效。

6 个答案:

答案 0 :(得分:5)

到目前为止,最简单的解决方案,如果您使用的是bash

printf %b "$foo"

或者,将其另存为另一个变量名bar

printf -v bar %b "$foo"

来自help printf

  

除了printf(1)中描述的标准格式规范      和printf(3),printf解释:

 %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)

但是有边缘案例:

  

\ c终止输出,反斜杠在\',\"和\?没有删除,   以\ 0开头的八进制转义符最多可包含四位数

答案 1 :(得分:2)

我知道的最佳方法是

  y=$(printf $(echo "$foo"|sed 's/%/%%/g'))

正如评论中所提到的,这会修剪$foo的尾随换行符。为了克服这个问题:

moo=$(echo "${foo}:end"|sed 's/%/%%/g')
moo=$(printf "$moo")
moo=${moo%:end}
# the escaped string is in $moo
echo "+++${moo}---"

答案 2 :(得分:1)

我发现我能做到这一点。根据评论进行编辑。

bar=$( echo -ne "$foo" )

答案 3 :(得分:0)

以下作品:

 eval bar=\$\'$x\'

命令栏= $' \ x61'必须首先构造,然后eval评估新构建的命令。

答案 4 :(得分:0)

通过shell转换的示例。问题,代码是八进制使用\0nnn和十六进制(不是在所有shell上)使用\xnn(其中n是[hexa]数字)

foo="\65"
print "$( echo "$foo" | sed 's/\\/&0/' )"

5

使用awk,你当然可以直接转换它

答案 5 :(得分:0)

从bash 4.4开始,就有一个变量扩展可以完全做到这一点:

$ foo='\x61';     echo "$foo" "${foo@E}"
\x61 a

要设置另一个变量,请使用:

$ printf -v bar "${foo@E}";     echo "$bar"
a