나는 그것으로부터 모든 링크를 얻으려고 노력하고 있습니다 materialdesignicons.com
! 나는 다음을 수행합니다.
curl -X GET https://materialdesignicons.com | grep -i "<link href=" | grep -v "<link href="
하지만 아무 것도 출력되지 않습니다. 까지 모든 것이 잘 작동합니다 grep -v
!
답변1
분석해 보겠습니다.
웹 크롤링
curl -X GET https://materialdesignicons.com
패턴 검색으로 결과 제공 (대소문자 상관없음)
<link href=
grep -i "<link href="
다음 단계의 결과는 일치하는 행을 검색하여 제공됩니다.불일치모델
<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
선택하라는 의미입니다.href
link
그러나 xmllint
귀하의 URL에서 다운로드한 html의 형식이 올바르지 않다고 불평하므로 올바른 형식의 출력을 다음으로 리디렉션하기 전에 자세한 내용을 억제 하고( ) 오류 메시지를 삭제하여 pipe
이를 수정합니다(tidy
-q
2>/dev/null
xmllint
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"
네이키드 링크를 제공하려면 일부 후처리가 필요하지만 이제 선택할 수 있는 도구가 있습니다.