次のコマンドを使用してHTMLのフォーム要素を解析しますgrep
。この$RESP
変数には前の要求の出力が含まれていますcurl
。
echo $RESP | grep -m 1 -o -E 'name="id" value="([A-Za-z0-9]+)"'
それは取得するすべてのインスタンスを除いて動作しますname="id"
。ページにはフォーム要素のインスタンスが複数あります。
最初の一致を停止するために-m 1
onを使用しようとしましたが、それでもすべての一致を返します。grep
私は何が間違っていましたか?私はそれを動作させることができます:
echo $RESP | grep -m 1 -o -E 'name="id" value="([A-Za-z0-9]+)"' | head -n 1 | cut -d '"' -f4
-m 1
しかし、なぜ機能しないのかはまだわかりません。
例を入力してください...
<html>
...
<input type="hidden" name="id" value="4234235325">
...
...
<input type="hidden" name="id" value="4234235325">
...
...
<input type="hidden" name="id" value="4234235325">
</html>
予想出力:
ID: 4234235325
すでに述べたように、フォーム要素はHTML全体で何度も繰り返されます。これが間違ったコーディングか最適化かはわかりません。しかし、サーバーは私のコントロールの範囲外です。
答え1
RESP変数拡張の周りの最も重要な引用符を省略すると、シェルにデータをスペースに分割し、ファイル名を挿入してデータを変更してから、grepに渡す前に1行に結合するように指示できます。これがgrep -m1
すべての一致を提供する理由です。最初の一致行の一致を提供します。この行は 1 行だけなので、すべて一致する行です。
$ var=$'hello\nworld';
$ echo $var
hello world
$ echo "$var"
hello
world
$ echo $var | grep -m1 -o '.o'
lo
wo
$ echo "$var" | grep -m1 -o '.o'
lo
だから拡張子を引用してください。echo "$RESP" | grep ...
。また、見ることができますhttp://mywiki.wooledge.org/Arguments
つまり、grep
、 、head
はcut
作業に適したツールとは距離が離れています。 xmlパーサーを使用してxmlを解析します。さもなければ召喚される危険があります。ポニー