在命令替换中转义AWK中的反斜杠

Bil*_*ill 5 bash awk backslash command-substitution

我试图逃避AWK的反斜杠.这是我想要做的一个例子.

说,我有一个变量

$echo $a
hi
Run Code Online (Sandbox Code Playgroud)

以下作品

$echo $a | awk '{printf("\\\"%s\"",$1)'}
\"hi"
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用命令替换将相同命令的输出保存到变量时,我收到以下错误:

$ q=`echo $a | awk '{printf("\\\"%s\"",$1)'}`
awk: {printf("\\"%s\"",$1)}
awk:               ^ backslash not last character on line
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么命令替换打破了AWK.非常感谢你的帮助.

jay*_*ngh 3

尝试这个:

q=$(echo $a | awk '{printf("\\\"%s\"",$1)}')
Run Code Online (Sandbox Code Playgroud)

测试:

$ a=hi
$ echo $a
hi
$ q=$(echo $a | awk '{printf("\\\"%s\"",$1)}')
$ echo $q
\"hi"
Run Code Online (Sandbox Code Playgroud)

更新:

会的,只是会变得更加混乱。

q=`echo $a | awk '{printf("\\\\\"%s\"",$1)}'`
Run Code Online (Sandbox Code Playgroud)

测试:

$ b=hello
$ echo $b
hello
$ t=`echo $b | awk '{printf("\\\\\"%s\"",$1)}'`
$ echo $t
\"hello"
Run Code Online (Sandbox Code Playgroud)

参考

  • @Lorkenpeist:来自 `bash` 的手册页: **当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后面跟着 $、` 或 \.**。因此,当您发现两个反斜杠时,它们的含义是通常的。否则它将按字面解释,因此使用 5 或 6 都可以。前者因为每两个,一个是输出,最后一个没有特殊意义。对于后者,因为所有这些都被解释并会输出其中的三个,正是您想要的。 (4认同)