Bash awk脚本转义随记

来自三线的随记
Admin讨论 | 贡献2020年4月17日 (五) 23:21的版本 (创建页面,内容为“由于某种奇怪的需求写了个curl版本爬虫 然后踩了个有趣的坑,mark一下,希望以后自己有能力给自己解答 <br /> === 前提说明…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

由于某种奇怪的需求写了个curl版本爬虫

然后踩了个有趣的坑,mark一下,希望以后自己有能力给自己解答


前提说明

& 是 awk 的求余符号

&amp; 是html字符实体编码(对应就是&)


来个简单的玩法

#!/bin/bash
set -xv
a="test&amp;"
echo  ` echo $a | awk '{gsub("&amp","&",$0);print $0}' `

其实预期效果个人感觉应该是抛出异常,然而

a="test&amp;"
+ a='test&amp;'
echo  ` echo $a | awk '{gsub("&amp","&",$0);print $0}' `
 echo $a | awk '{gsub("&amp","&",$0);print $0}' 
++ awk '{gsub("&amp","&",$0);print $0}'
++ echo 'test&amp;'
+ echo 'test&amp;'
test&amp;


真难看,解开一下

#set +x
+ a='test&amp;'
++ awk '{gsub("&amp","&",$0);print $0}'
++ echo 'test&amp;'
+ echo 'test&amp;'
test&amp;


#set +v
a="test&amp;"
echo  ` echo $a | awk '{gsub("&amp","&",$0);print $0}' `
 echo $a | awk '{gsub("&amp","&",$0);print $0}' 
test&amp;

看起来没报错,但是结果不符合预期,估计gsub里面憨憨了(我猜)

对比

#!/bin/bash
set -v
a="test&amp;"
echo  ` echo $a | awk '{gsub("&amp","1",$0);print $0}' `
root@Server:~# bash awk_bash.sh 
a="test&amp;"
echo  ` echo $a | awk '{gsub("&amp","1",$0);print $0}' `
 echo $a | awk '{gsub("&amp","1",$0);print $0}' 
test1; 


转义

#!/bin/bash
set -v
a="test&amp;"
echo  ` echo $a | awk '{gsub("&amp","\\\&",$0);print $0}' `


结果符合预期

a="test&amp;"
echo  ` echo $a | awk '{gsub("&amp","\\\&",$0);print $0}' `
 echo $a | awk '{gsub("&amp","\\&",$0);print $0}' 
test&;
#set -x
+ a='test&amp;'
++ awk '{gsub("&amp","\\&",$0);print $0}'
++ echo 'test&amp;'
+ echo 'test&;'
test&;

(三个反斜杠,也是麻烦)