tr 명령은 8진수 시퀀스에서 작동하지 않습니다.

tr 명령은 8진수 시퀀스에서 작동하지 않습니다.

파일에서 ASCII가 아닌 문자를 제거해야 합니다. 나는 명령을 사용하고 있습니다 -

/usr/xpg4/bin/tr -cd '\0-\177' <non-ASCII_file.dat >ASCII_file.dat

과거에는 작동했지만 지금은 작동하지 않습니다. 이제 모든 알파벳과 ASCII가 아닌 문자를 제거합니다. ASCII 파일에 예약된 유일한 문자는 ASCII 세트의 숫자와 특수 문자입니다.

운영 체제는 솔라리스 9입니다.

이 문제의 원인은 무엇입니까? 8진수 범위가 잘못 해석되고 있습니까? 내 환경과 관련이 있나요?

답변1

문자 범위의 동작은 로케일, 즉 국제화 설정에 따라 다릅니다. 로케일마다 문자 순서가 다릅니다. 예를 들어, 프랑스어 로케일(및 문자가 있는 대부분의 로케일 â) 에는 after 및 before 가 â있습니다 .ab

C 로케일은 문자가 바이트이고 바이트 값에 따라 정렬되는 언어 중립적(또는 선택해야 하는 경우 미국 영어 전용) 로케일입니다.

로케일 영역은 문자 유형과 문자가 정의되는 순서를 정의하는 tr것과 관련이 있습니다 . UTF-8이 기본 문자 집합으로 점점 일반화되면서 문자의 바이트 수가 이제 가변적입니다.LC_CTYPELC_COLLATE

동일한 이름의 환경 변수를 사용하여 지정할 수 있습니다. LC_ALL그러나 그것들을 모두 덮어라. 따라서 원하는 동작을 얻으려면 LC_ALL을 설정 해제하고 원하는 동작을 설정해야 합니다. 또는 더 간단하게 LC_ALL을 설정하면 됩니다.

LC_ALL=C tr -cd '\0-\177'

또는:

LC_ALL=C tr -d '\200-\377'

이는 UTF-8 데이터에도 적용됩니다. 왜냐하면 UTF-8은 ASCII의 상위 집합이고 모든 비ASCII 문자는 모든 바이트에서 8번째 비트가 설정되어 있기 때문입니다.

관련 정보