![간단한 스크립트 구문 분석 텍스트, 여기서 무엇이 잘못되었나요?](https://rvso.com/image/1344712/%EA%B0%84%EB%8B%A8%ED%95%9C%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EA%B5%AC%EB%AC%B8%20%EB%B6%84%EC%84%9D%20%ED%85%8D%EC%8A%A4%ED%8A%B8%2C%20%EC%97%AC%EA%B8%B0%EC%84%9C%20%EB%AC%B4%EC%97%87%EC%9D%B4%20%EC%9E%98%EB%AA%BB%EB%90%98%EC%97%88%EB%82%98%EC%9A%94%3F.png)
나는 다음을 많이 사용합니다.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가 실제로 소스의 엔터티로 표시되어 <
문자열이 좀 더 길어집니다.
답변3
고려해야 할 사항은 다음과 같습니다. 스크립트의 결과 문자열에는 sed 작업에서 적절하게 이스케이프되지 않는 특정 문자가 포함될 수 있습니다.
예를 들어 대괄호, 작은따옴표 및 큰따옴표, 중괄호, 느낌표, 슬래시 및 백슬래시, 별표 등의 문자는 의심스러울 수 있습니다.
일련의 테스트를 통해 반환된 문자열에서 이러한 문자 중 하나를 제거하고 결과를 비교하여 이러한 문자 중 하나를 제거하면 개수가 63이 되는지 확인하려고 합니다.
답변4
mousio에 대한 귀하의 의견에 따라 grep/sed... 체인을 하나의 명령으로 줄일 수 있습니다.
Perl은 일반적으로 기본적으로 설치됩니다.
perl -ne 'next unless /63 random printable ASCII characters:/; s/^.*size=2>//; s/<\/font>.*$//; s/"/"/g; s/'/'\''/g; s/&/&/g; s/</</g; s/>/>/g; print; exit'
모든 sed가 이 구문을 이해하는 것은 아닙니다.
sed -n '/63 random printable ASCII characters:/{s/^.*size=2>//; s/<\/font>.*$//; s/"/"/g; s/'/'\''/g; s/&/\&/g; s/</</g; s/>/>/g; p;q}'