grep 사용

grep 사용

나는 그것으로부터 모든 링크를 얻으려고 노력하고 있습니다 materialdesignicons.com! 나는 다음을 수행합니다.

curl -X GET https://materialdesignicons.com | grep -i "<link href=" | grep -v "<link href="

하지만 아무 것도 출력되지 않습니다. 까지 모든 것이 잘 작동합니다 grep -v!

답변1

분석해 보겠습니다.

  1. 웹 크롤링

    curl -X GET https://materialdesignicons.com
    
  2. 패턴 검색으로 결과 제공 (대소문자 상관없음)<link href=

    grep -i "<link href="
    
  3. 다음 단계의 결과는 일치하는 행을 검색하여 제공됩니다.불일치모델<link href=

    grep -v "<link href="
    

결과적으로 <link href=하나 이상의 대문자와 일치하는 텍스트만 얻을 수 있습니다. 예를 들어

<link href=        # Will not match
<link HREF=        # Will match
<LinK HrEf=        # Will match

모든 값을 나열하려면 link href다음을 시도해 볼 수 있습니다. 여러 줄로 분할되지 않은 링크와 일치합니다.

curl -X GET https://materialdesignicons.com | grep -Po "(?<=link href=([\"'])).*?(?=\g1)"

이것은 특별히 기분 좋은 정규식이 아니므로 여러분을 위해 분석해 보겠습니다.

(?<=link href=([\"']))    # Look for "link href=" followed by either single or double quote
.*?                       # Match and output the shortest possible string until...
(?=\g1)                   # We have found a repeat of the quote we found earlier

답변2

또 다른 grep 솔루션은

grep -iPo "(<link href=\")[^\"]*"

[]문자 클래스는 단일 문자 a ", 이스케이프( )만 포함하는 것으로 정의됩니다 \". 그 이유는 여러분이 이해할 수 있기를 바랍니다. 그런 다음 클래스는 부정되어 ^"a가 아닌 모든 것 ""을 의미합니다.

이는 "대소문자를 구분하지 않는 항목을 찾은 다음 <link href="a를 찾을 때까지 다음 문자를 모두 일치시킨 "다음 중지하되 포함하지 않음 ""으로 해석됩니다.

어쨌든 @roaima가 나를 정규식 솔루션으로 이겼고 나는 그것에 계속해서 패배했기 때문에 (분명히) html 구문 분석에 권장되지 않으므로 , xpath( )를 grep가지고 놀아 보는 것이 좋을 것이라고 생각했습니다. 정규식에 익숙하지 않다면 꼭 숙지하시기 바랍니다. xmllint//link/@href

xmllint --html --xpath "//link/@href" <( curl -X GET https://materialdesignicons.com )

이는 문서를 xmllint예상 --html하고 --xpath표현식을 사용하여 모든 태그 의 속성을 //link/@href선택하라는 의미입니다.hreflink

그러나 xmllint귀하의 URL에서 다운로드한 html의 형식이 올바르지 않다고 불평하므로 올바른 형식의 출력을 다음으로 리디렉션하기 전에 자세한 내용을 억제 하고( ) 오류 메시지를 삭제하여 pipe이를 수정합니다(tidy-q2>/dev/nullxmllint

xmllint --html --xpath "//link/@href" <( curl -X GET https://materialdesignicons.com | tidy -q 2>/dev/null)

이로 인해 href여전히 사랑스럽게(?) 인용되는 속성이 생성됩니다.

href="/favicon.png" href="//fonts.googleapis.com/css?family=Roboto:400,300" href="styles/css/bootstrap.css" href="styles/app.css"

네이키드 링크를 제공하려면 일부 후처리가 필요하지만 이제 선택할 수 있는 도구가 있습니다.

관련 정보