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


169

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

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


1
폴, 네 펄을 사용할 수 있습니다
Rory

/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]
Tinmarino

답변:


310

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

[^\x00-\x7F]

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

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

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

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


3
@adrianm : 아니요 ^. PCRE에서 유효합니다.
Alix Axel

10
맞습니다. 그러나 표준 grep이 아닌 pcregrep을 사용해야합니다. 터미널이 UTF8로 설정된 경우 [^ [: print :]]가 작동하지 않습니다.
Rory

@Rory, 왜 :print:UTF8 터미널에서 작동하지 않습니까? UTF8 터미널에서 놀리려는에서 나를 위해이 작품 :27.chr =~ /[^[:print:]]/
akostadinov

이 나쁜 파일 이름을 고정하기위한 정말 좋은 - rename 's/[^\x00-\x7F]//g' *(당신이 사용할 수있는 -n이름 변경 먼저 확인됩니다 확인).
naught101

UTF8 이외의 문자와 다른 특정 문자를 일치 시키려면 어떻게합니까?
CMCDragonkai

37

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

이것은 실제 ASCII입니다.

 [^\x00-\x7F]

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



3

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



3

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


2

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

[^\w \xC0-\xFF]

Case ask, 옵션은 Multiline 입니다.


2

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

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

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

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


뒤늦게, 나는이 것을 관찰 할 수 않습니다 실제로이 패턴과 일치하는 일부 파일이있는 경우 제대로 일을. 일치하는 항목이 없을 때 패턴이 인쇄되는 동작은 약간 놀랍지 만 실제로는 정확합니다. 희망을 분명히하기 위해 답을 편집했습니다.
tripleee 2019 년

1

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.