Perl을 사용하여 파일에서 확장 된 ASCII 문자를 어떻게 찾을 수 있습니까?
-
22-08-2019 - |
문제
Perl을 사용하여 파일에서 확장 된 ASCII 문자를 어떻게 찾을 수 있습니까? 누구든지 스크립트를 얻을 수 있습니까?
..... 미리 감사드립니다 .....
해결책
확장 된 이후 ASCII 캐릭터는 가치가 있습니다 128 이상, 당신은 그냥 전화 할 수 있습니다 주문 개별 문자에서 값> = 128을 가진 사람들을 처리합니다. 다음 코드는 stdin에서 읽히고 확장 된 ASCII 문자 만 인쇄합니다.
while (<>) {
while (/(.)/g) {
print($1) if (ord($1) >= 128);
}
}
대안 적으로, 풀다 함께 chr 또한 작동합니다. 예시:
while (<>) {
foreach (unpack("C*", $_)) {
print(chr($_)) if ($_ >= 128);
}
}
(일부 Perl Guru 가이 두 가지를 두 개의 1 라이너에게 압축 할 수 있다고 확신합니다 ...)
대신 라인 번호를 인쇄하려면 다음을 사용할 수 있습니다 (이것은 복제를 제거하지 않으며 유니 코드가 통과 될 때 홀수 동작이 있습니다).
while (<>) {
while (/(.)/g) {
print($. . "\n") if (ord($1) >= 128);
}
}
(감사 Yaakov Belch 용 $.
팁.)
다른 팁
첫 번째 인쇄 가능한 ASCII 캐릭터는입니다 space
(32). 마지막 인쇄 가능한 ASCII 문자는입니다 ~
(126). 그래서 아마 사용할 것입니다
while (<>) {
print "$.\n" if /[^ -~]/;
}
비록 그것이 제어 문자와 확장 된 ASCII를 포함하는 라인을 표시 할 것입니다.
편집하다: 선 자체가 아닌 줄 번호를 인쇄하도록 변경되었습니다.
짧막 한 농담:
perl -nE'say$.if/[\xE0-\xFF]/'
구형 Perl 버전의 경우
perl -lne'print$.if/[\xE0-\xFF]/'
중요한 질문은
바이트 사용;
Pragma는 유효해야합니다. 포스터는 그것을 결정해야합니다. 선택을 위해 캐릭터 코드가 127보다 큰 코드로 다음으로 충분합니다.
print grep 127 < ord, split // while <>;
또는
print grep /[^[:ascii:]]/, split // while <>;
Hynek -Pichi -vychodil의 답변 :
perl -nE'say$.if/[\xE0-\xFF]/'
비 인쇄의 제한된 부분 만 테스트 할 것입니다.
perl -nE'say$.if/[\x80-\xFF]/'
대신에.
Grep은 어떻습니까?
grep [\x00-\x1F\x7F-\xFF]+ *