2016-04-13 13 views
0

私は、HTTPステータスコードとカールリクエストのボディの両方をキャプチャする正規表現を作成しようとしています。以下の正規表現パターンは複数のオンラインサイトで動作しますが、私のMacのコマンドラインではin a shell if-statementと一致しません。私の正規表現はオフですか、それとも別のことが起こっていますか?Curl HTTPステータスコードとボディレスポンスを取得するための正規表現

RESPONSE=$(curl -s -i -X GET http://www.google.com/) 

# Match and capture the status code, match the headers, match two new lines, match and capture an optional body 
re="^HTTP\/\d\.\d\s([\d]{3})[\w\d\s\W\D\S]*[\r\n]{2}([\w\d\s\W\D\S]*)?$" 

if [[ "${RESPONSE}" =~ $re ]]; then 
    echo "match" 
    # Now do stuff with the captured groups, "${BASH_REMATCH[...]}" 
else 
    echo "no match" 
fi 

私はこれを行う他の方法(CentOS 5を実行しているマシンをターゲットにしています)にも開いています。

+2

ファイルに身体を書くと、stdoutにだけステータスコードカール出力を持つように '-w'カールフラグを使うのか? –

+0

'^ HTTP/[0-9] \。[0-9] [0-9] {3} OK'エスケープするピリオドとスペースはOKですが、他のエスケープシーケンスは解釈されています文字通り。ステータスコードをキャプチャするとどちらも機能するとは思わない。 sed、awk、perlなどの方が良いかもしれません。 –

+0

@ColeTierneyあなたはそれを拡張できますか? '\ d'や' \ w'のような他のエスケープシーケンスは文字通り解釈されるのはなぜですか? –

答えて

2

他のソリューションにもオープンしているので、これを試すことができます。

RESPONSE=$(curl -s -i -X GET http://www.google.com/) 

HTTP_STATUS_CODE=`echo $RESPONSE | sed ' 
    /HTTP/ { 
    s/^HTTP[^ ]* // 
    s/ .*$// 
    q 
    } 
    D'` 

BODY=`echo $RESPONSE | sed ' 
    /^.$/ { 
    :body 
    n 
    b body 
    } 
    D'` 

echo $HTTP_STATUS_CODE 
echo $BODY 

はHTTPで始まる最初の行にあります。最初のスペースが削除され、結果( '302 Found')から最初のスペースからラインの終わりまでのすべてが削除されるまで、スペース以外のすべてのスペースが削除されます。

BODYは、1つの文字に一致する最初の行から始まります(前の行は 'D'で削除されます)。ここから、すべての行を入力の終わりまで印刷します。

+0

どちらの部分も 'sed:RE error:不正なバイト列'私のOSX端末で。 –

+0

OSXのzshとbashで動作します。どのような問題が起こっているのかわかりません...テキストエディタにコピーして印刷できない文字をすべて表示することをお勧めします。 – derlarsschneider

+0

私は、彼の答えで@nericによってリンクされた投稿を使用してエラーを修正しました。上記を実行すると(それぞれの 'sed'の前に' LC_ALL = C'を設定して)、 'HTTP_STATUS_CODE'が実行されますが、' BODY'は空であるようです。 –

2

@delarsschneiderと同じ考え方に、わずかに少ない複雑

RESPONSE=$(curl -s -i -X GET http://www.google.com/) 

CODE=$(echo $RESPONSE | sed -n 's/HTTP.* \(.*\) .*/\1/p') 

BODY=$(echo $RESPONSE | tr '\n' ' ' | sed -n 's/.*GMT *\(.*\)/\1/p') 

echo $CODE 
echo $BODY 
+0

以下のエラーはまったく同じです: 'sed:REエラー:不正なバイト列'。理由は分かりません。私は文字通り、上記を端末にコピー/ペーストしています。 –

+0

ええと、あなたはこれを見ましたか:http://stackoverflow.com/questions/19242275/re-error-illegal-byte-sequence-on-mac-os-x – neric

+0

興味深い。 'CODE'の' sed'の前に 'LC_ALL = C'を置くとコマンドは動作しますが、出力は間違っています。 BODYの 'sed'の前に' LC_ALL = C'を実行しても、コマンドは同じエラーで失敗します。 –

関連する問題