2

引用符で囲まれたxmlをjsonpスタイルのコールバックでラップする「単純な」cgiシェルスクリプトプロキシサーバーを作成しているときに、バックスラッシュのエスケープに関する問題が発生しました(これは試行錯誤とOperaの優れたデバッガーによって解決されました)。私はまだバックスラッシュの追加セットが必要な理由を理解しようとしています(8対4)。解析するたびにバックスラッシュの数を2倍にする必要があることを理解していますが、どこかで反復を見落としているように見えるか、処理を誤解しています。ブラウザで2回解析されますか?

これは、なぜそれが機能するのかを理解しようとしている最後の機能するコードです

#!/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に詰め込むだけです

4

1 に答える 1

2

1つのパスはBashによって実行されます。このコマンド:

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

このsedスクリプトを実行します:

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

1つのパスはsed;によって実行されます。置換文字列で、\\はを意味し\ます。したがって、このスクリプトはにsed置き換え\られます。あなたが望むように。(周りの角かっこは実際にはここでは何もしません。周りの角かっこは別の角かっこでエスケープするのと同じです。)\\"\""\\

Bashスクリプトで二重引用符ではなく一重引用符を使用すると、円記号の1つのセットを削除できます。一重引用符の中に\は、特別な意味はありません。つまり、これを変更できます。

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

これに:

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

または、そのことについては、これに:

sed 's/\\/\\\\/g;s/"/\\"/g'
于 2013-03-10T02:35:38.917 に答える