我试图在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。非常感谢你的帮助。
答案 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"
答案 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