간단한 스크립트 구문 분석 텍스트, 여기서 무엇이 잘못되었나요?

간단한 스크립트 구문 분석 텍스트, 여기서 무엇이 잘못되었나요?

나는 다음을 많이 사용합니다.https://www.grc.com/passwords.htm강력한 비밀번호를 얻으려면. 하지만 매번 사이트에 가서 수동으로 비밀번호를 복사해야 하는 것은 시간이 너무 오래 걸리기 때문에 이를 위해 작은 스크립트를 작성하기로 결정했습니다. 페이지를 다시 로드할 때마다 새 비밀번호가 일반 텍스트로 표시되므로 이것이 스크립트입니다.

curl 'https://www.grc.com/passwords.htm' | grep '63 random printable ASCII characters:' | sed 's/^.*size=2>//' | sed 's/<\/font>.*$//' | pbcopy

식별 가능한 클래스나 ID가 없기 때문에 페이지를 통해 curl파이프를 통해 원하는 줄 grep("인쇄 가능한 임의의 ASCII 문자 63개:")을 얻은 다음 sed암호까지의 모든 항목과 모든 항목을 삭제하는 데 사용합니다. 그 후 마지막으로 pbcopy.

하나의 작은 세부 사항을 제외하고는 모두 잘 작동합니다. 마지막에 얻는 문자열은 항상 63자 길이여야 하지만 그렇지 않습니다. 보통 64, 67, 70, 73 사이로 다양하며 그 이유는 모르겠습니다.

누구든지 이것에 대해 밝힐 수 있습니까?

답변1

처럼무시오이미 말했듯이 문제는 일부 특수 문자의 HTML 인코딩입니다.

Perl은 이를 안정적이고 쉽게 변환할 수 있습니다.

curl 'https://www.grc.com/passwords.htm' | \
    grep 'ASCII characters:' \
    perl -MHTML::Entities -ne 's/.*2>|<.*//g; print decode_entities($_)'

답변2

이는 HTML 인코딩과 관련이 있을 수 있습니다. 예를 들어 <63자의 a가 실제로 소스의 엔터티로 표시되어 &lt;문자열이 좀 더 길어집니다.

답변3

고려해야 할 사항은 다음과 같습니다. 스크립트의 결과 문자열에는 sed 작업에서 적절하게 이스케이프되지 않는 특정 문자가 포함될 수 있습니다.

예를 들어 대괄호, 작은따옴표 및 큰따옴표, 중괄호, 느낌표, 슬래시 및 백슬래시, 별표 등의 문자는 의심스러울 수 있습니다.

일련의 테스트를 통해 반환된 문자열에서 이러한 문자 중 하나를 제거하고 결과를 비교하여 이러한 문자 중 하나를 제거하면 개수가 63이 되는지 확인하려고 합니다.

답변4

mousio에 대한 귀하의 의견에 따라 grep/sed... 체인을 하나의 명령으로 줄일 수 있습니다.

Perl은 일반적으로 기본적으로 설치됩니다.

perl -ne 'next unless /63 random printable ASCII characters:/; s/^.*size=2>//; s/<\/font>.*$//; s/&quot;/"/g; s/&apos;/'\''/g; s/&amp;/&/g; s/&lt;/</g; s/&gt;/>/g; print; exit'

모든 sed가 이 구문을 이해하는 것은 아닙니다.

sed -n '/63 random printable ASCII characters:/{s/^.*size=2>//; s/<\/font>.*$//; s/&quot;/"/g; s/&apos;/'\''/g; s/&amp;/\&/g; s/&lt;/</g; s/&gt;/>/g; p;q}'

관련 정보