IT

(grep) 정규식이 아닌 ASCII 문자와 일치합니까?

lottoking 2020. 6. 9. 07:50
반응형

(grep) 정규식이 아닌 ASCII 문자와 일치합니까?


리눅스에는 파일이 많은 디렉토리가 있습니다. 그들 중 일부는 비 ASCII 문자를 가지고 있지만 모두 유효한 UTF-8 입니다. 하나의 프로그램에는 ASCII가 아닌 파일 이름으로 작업하는 것을 방해하는 버그가 있으며 영향을받는 파일 수를 알아야합니다. 이 작업 find을 수행 한 다음 grep수행 하여 비 ASCII 문자를 인쇄 한 다음 wc -l숫자를 찾으려고합니다. grep 일 필요는 없습니다. Perl , sed , AWK 등과 같은 표준 Unix 정규식을 사용할 수 있습니다 .

그러나 'ASCII 문자가 아닌 문자'에 대한 정규식이 있습니까?


이것은 ASCII가 아닌 단일 문자와 일치합니다.

[^\x00-\x7F]

유효한 PCRE ( Perl-Compatible Regular Expression )입니다.

POSIX 속기를 사용할 수도 있습니다 .

  • [[:ascii:]] -단일 ASCII 문자와 일치
  • [^[:ascii:]] -비 ASCII 문자 하나와 일치

[^[:print:]] 아마 당신에게 충분할 것입니다. **


아니요, [^\x20-\x7E]ASCII가 아닙니다.

이것은 실제 ASCII입니다.

 [^\x00-\x7F]

그렇지 않으면 ASCII 테이블의 일부인 줄 바꿈 및 기타 특수 문자가 제거됩니다!


다음 과 같은 유용한 유니 코드 문자 클래스가 포함되어 있으므로 유니 코드 정규 표현식 페이지를 확인할 수도 있습니다 .

\ p {Control} : ASCII 0x00..0x1F 또는 Latin-1 0x80..0x9F 제어 문자.

[^\x00-\x7F]그리고 [^[:ascii:]]그래서 일부 제어 바이트 그리워 문자열이 때로는 더 좋은 옵션이 될 수 있습니다. 예를 들어 cat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g'터미널에서 이상한 일을 할 strings test.torrent것입니다.


나는 그것을 사용 [^\t\r\n\x20-\x7E]+하고 잘 작동하는 것 같습니다.


정규식이 실제로 필요하지 않습니다.

printf "%s\n" *[!\ -~]*

이름에 제어 문자가있는 파일 이름도 표시되지만 그 기능을 고려합니다.

일치하는 파일이 없으면 설정하지 않은 한 glob가 그 자체로 확장됩니다 nullglob. (표현식 자체와 일치하지 않으므로 기술적으로이 출력은 명확하지 않습니다.)


이 정규식을 사용할 수 있습니다.

[^\w \xC0-\xFF]

Case ask, 옵션은 Multiline 입니다.


이것은 매우 유연하고 확장 가능한 것으로 판명되었습니다. $ field = ~ s / [^ \ x00- \ x7F] // g; # 따라서 모든 비 ASCII 또는 특정 항목을 청소할 수 있습니다. 결국 해시 키가 될 항목을 선택하거나 사전 처리하는 데 매우 좋습니다.


텍스트 상자의 유효성을 검사하려면 ASCII 만 허용이 패턴 만 사용

[\x00-\x7F]+

참고 URL : https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters

반응형