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

时间:2013-05-28 21:23:30

标签: bash awk backslash command-substitution

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

说,我有一个变量

$echo $a
hi

以下作品

$echo $a | awk '{printf("\\\"%s\"",$1)'}
\"hi"

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

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

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

3 个答案:

答案 0 :(得分:3)

试试这个:

q=$(echo $a | awk '{printf("\\\"%s\"",$1)}')

测试:

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

更新

它会,它只是一个更小的混乱。

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

测试:

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

Reference

答案 1 :(得分:1)

引用反引号中的命令有点复杂,很重要 因为相同的标记用于启动和结束反引号 命令。因此,嵌套反引号命令,反引号 内部的必须使用反斜杠进行转义。此外, 反斜杠可用于引用其他反斜杠和美元符号 (后者实际上是多余的)。如果反引号命令是 包含在双引号中,反斜杠也可用于引用a 双引号。 shell读取时会删除所有这些反斜杠 反引号命令。所有其他反斜杠都保持不变。

新的$(...)避免了这些麻烦。

答案 2 :(得分:1)

不要使用反引号来引入坏习惯,引用和解析shell变量到awk正确的方法是:

$ shell_var="hi"

$ awk -v awk_var="$shell_var" -v c='\' 'BEGIN{printf "%s%s\n",c,awk_var}'
\hi

$ res=$(awk -v awk_var="$shell_var" -v c='\' 'BEGIN{printf "%s%s\n",c,awk_var}')

$ echo "$res"
\hi