2013-03-10 73 views
2

在编写一个简单的cgi shell脚本代理服务器来包装一个jsonp风格的回调函数的xml时,我碰到了一个转义反斜杠的问题(这是通过反复试验和Opera的优秀调试器解决的)。我仍然试图找出为什么需要额外的反斜杠(8对4)。我明白,每次解析都需要加倍反斜杠的数量,但是我似乎忽略了某处的迭代,或者误解了处理。它在浏览器中被解析两次吗?为什么我需要8个反斜杠?

这是我想为什么它

#!/bin/sh 
CB=${QUERY_STRING%%&*} 
URL=${QUERY_STRING#*&} 
case "$CB" in 
    callback=*) 
     printf "Content-type: application/javascript\r\n\r\n${CB##*=}(\"" 
     wget -q --no-check-certificate -U "NetSurf/2.9 (Linux; i686)" -T 20 -O - "$URL" \ 
      |tr -c [\ -~] " "|sed "s/[\\]/\\\\\\\\/g;s/[\"]/\\\\\"/g" 
     printf "\")" 
     ;; 
    *)exit;; 
esac 

这里是我使用(编辑 - 用更简单的非gzip的版本替换)测试页找出最后的工作代码。

<html><head><title>test</title></head><body><div id="notaniframe"></div> 
<script> 
    function dummy(data){document.getElementById("notaniframe").innerHTML=data} 
    Loaded=0 
    setTimeout(function(){if(!Loaded)alert("load failed")},30000); 
</script> 
<script onload='Loaded=1' src="http://localhost/cgi-bin/xml2jsonp.cgi?callback=dummy&http://stackoverflow.com"></script> 
</body></html> 

这只是的CRAM stackoverflow.com成

回答

2

一次通过由击执行一个div;此命令:

sed "s/[\\]/\\\\\\\\/g;s/[\"]/\\\\\"/g" 

运行此sed脚本:由sed执行

s/[\]/\\\\/g;s/["]/\\"/g 

一次通过;在替换字符串中,\\表示\。所以这sed脚本将取代\\\"\"。正如你想要的。 (请注意,周围"方括号实际上没有做任何事情在这里,和方括号\相当于另一个\逃脱它。)

您可以使用单引号去掉一组反斜杠而不是Bash脚本中的双引号;在单引号内,\没有特别的意义。换句话说,你可以改变这一点:

sed "s/[\\]/\\\\\\\\/g;s/[\"]/\\\\\"/g" 

这样:

sed 's/[\]/\\\\/g;s/["]/\\"/g' 

或者,对于这个问题,这样的:

sed 's/\\/\\\\/g;s/"/\\"/g' 
+0

'sed的“S/[\]/\\\\/g; s/[“]/\\”/ g''正是我所错过的,我不知道为什么我这次用sed使用双引号。谢谢。 – technosaurus 2013-03-10 02:46:56

+0

@technosaurus:不客气! – ruakh 2013-03-10 07:05:52