代码之家  ›  专栏  ›  技术社区  ›  technosaurus

为什么我需要8个反斜杠?

  •  2
  • technosaurus  · 技术社区  · 13 年前

    在编写一个“简单”的cgi-shell脚本代理服务器以将引用的xml封装在jsonp风格的回调中时,我遇到了转义反斜杠的问题(通过试错和Opera出色的调试器解决了这个问题)。我仍在试图弄清楚为什么需要额外的反斜杠集(8对4)。我已经明白,每次解析都需要将反斜杠的数量增加一倍,但要么我似乎忽略了某个地方的迭代,要么误解了处理。它在浏览器中被解析两次吗?

    这是我试图弄清楚为什么它能工作的最后一个工作代码

    #!/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>
    

    这只是把stackoverflow.com塞进一个div

    1 回复  |  直到 13 年前
        1
  •  2
  •   ruakh    13 年前

    一次传球由Bash完成;此命令:

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

    运行这个 sed 脚本:

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

    一次通过由 sed公司 ; 在替换串中, \\ 方法 \ 。所以这个 sed公司 脚本将替换 \ 具有 \\ " 具有 \" 。如你所愿。(注意周围的方括号 " 不要在这里做任何事情,周围的方括号 \ 相当于用另一个逃离它 \ .)

    您可以通过在Bash脚本中使用单引号而不是双引号来删除一组反斜杠;在单引号内, \ 没有什么特别的意义。换句话说,您可以更改这一点:

    sed“s/[\]/
    

    对此:

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

    或者,就这一点而言:

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