grep -m 1が機能しない

grep -m 1が機能しない

次のコマンドを使用してHTMLのフォーム要素を解析しますgrep。この$RESP変数には前の要求の出力が含まれていますcurl

echo $RESP | grep -m 1 -o -E 'name="id" value="([A-Za-z0-9]+)"'

それは取得するすべてのインスタンスを除いて動作しますname="id"。ページにはフォーム要素のインスタンスが複数あります。

最初の一致を停止するために-m 1onを使用しようとしましたが、それでもすべての一致を返します。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、 、headcut作業に適したツールとは距離が離れています。 xmlパーサーを使用してxmlを解析します。さもなければ召喚される危険があります。ポニー

関連情報