5

我试图逃避 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。非常感谢你的帮助。

4

3 回答 3

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"

参考

于 2013-05-28T21:25:31.037 回答
1

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

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

于 2013-05-28T21:54:23.700 回答
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
于 2013-05-28T22:42:06.070 回答