我看过this question,但它不包括我的用例。
假设我有变量foo
,它包含四个字符的文字\x60
。
我想对此变量的内容执行ANSI C Quoting并将其存储到另一个变量bar
中。
我尝试了以下方法,但没有一个达到预期的效果。
bar=$'$foo'
echo $bar
bar=$"$foo"
echo $bar
输出:
$foo
\x61
所需输出(\x61
的实际值):
a
如何在一般情况下实现此目的,包括不可打印的字符?请注意,在这种情况下,a
仅用作示例,以便更轻松地测试方法是否有效。
答案 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