Perl을 사용하여 파일에서 확장 된 ASCII 문자를 어떻게 찾을 수 있습니까?

StackOverflow https://stackoverflow.com/questions/881931

문제

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]+ *
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top