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에 전달하기 전에 한 줄로 결합하도록 지시할 수 있습니다. 이것이 grep -m1모든 일치 항목을 제공하는 이유입니다. 첫 번째 일치 행에 대한 일치 항목을 제공합니다. 이 행은 단 하나의 행이기 때문에 모두 일치하는 행입니다.

$ 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을 구문 분석합니다. 그렇지 않으면 소환될 위험이 있습니다.조랑말

관련 정보