텍스트 파일이 있고 "잘못된" 문자를 정리하고 싶습니다. vim으로 열면 (":set number" 사용):
57000044 zo¥<9a>¥ge¥o¥graph¥i¥cal¥ly
39999999 pariá¹<83>Å<9b>a
예를 들어, "<9a>", "<83>", "<9b>"는 vim에서 파란색으로 표시되며, 이 두 줄은 vim 외부에서 다음과 같습니다.
$ sed '57000044,57000044!d' toclean.txt
zo���ge�o�graph�i�cal�ly
$ sed '57000044,57000044!d' toclean.txt | cat -vte -
zoM-%M-^ZM-%geM-%oM-%graphM-%iM-%calM-%ly$
$
그리고
$ sed '39999999,39999999!d' toclean.txt
pariṃśa
$ sed '39999999,39999999!d' toclean.txt | cat -vte -
pariM-aM-9M-^CM-EM-^[a$
$
질문:위의 "<9a>", "<83>" 및 "<9b>"에 대한 16진수 ASCII 문자가 무엇인지 어떻게 알 수 있습니까? 또는 "1" 또는 "¥"...
파일을 모두 제거하여 더 깔끔하게 만들려면 16진수 코드가 필요합니다. 예를 들어 이 코드는 16진수 ASCII "x09"를 제거하므로 "가로 탭"이 됩니다.
sed -i 's/[\x09]//g' toclean.txt
16진수로 "9A" 또는 "A5"를 사용해 보았지만 도움이 되지 않았습니다.
$ sed '57000044,57000044!d' toclean.txt | sed 's/[\x9A]//g; s/[\xA5]//g'
zo���ge�o�graph�i�cal�ly
zo���ge�o�graph�i�cal�ly
$
답변1
hex:<9a> 및 hex:<83> 코드는 ASCII 코드가 아닙니다(ASCII 코드는 <00>부터 <7F>까지만 가능). 또한 어떤 문자(ASCII보다 큰 문자 집합에서)가 이러한 코드와 연관되어 있는지 "찾을" 수 없습니다. 이는 기본 문자 집합("코드 페이지") 인코딩에 따라 달라지기 때문입니다. 따라서 데이터를 만든 사람에게 어떤 문자 인코딩을 사용했는지 물어봐야 합니다. (종종 찾을 수 있는 일반적인 인코딩은 ISO 8859-1, ISO 8859-15, UTF-8, UCS-2입니다. 온라인에서 찾은 코드 테이블을 확인하여 이러한 인덱스가 있는 문자가 데이터 컨텍스트에서 가장 의미가 있는지 확인할 수도 있습니다. .)
삭제하려는 코드 값을 알고 나면 (예를 들어) 옵션 (8진 인수) tr
과 함께 명령을 사용할 수 있습니다.-d
답변2
ASCII 코드7비트 문자 집합입니다. 128보다 큰 값을 갖는 문자는 ASCII가 아닌 문자입니다.
당신이 사용하는 경우유니코드, 문자는 여러 바이트로 표시됩니다(256개의 서로 다른 바이트 값만 있지만 유니코드 문자는 100,000개 이상임). 유니코드의 사실상의 표준 표현은 다음과 같습니다.UTF-8각 문자는 가변 개수의 바이트를 사용합니다. ASCII 문자는 단일 바이트로 표시되고 다른 문자는 2~4바이트로 표시됩니다.
Vim은 일부 문자를 파란색 자리 표시자로 표시합니다. 예를 들어 <9a>
이 바이트는 현재 지정된 문자 집합의 유효한 문자 표현에 속하지 않기 때문입니다.로케일.
바이트를 처리하려면 로케일을 LC_CTYPE
로 설정하십시오 C
.
LC_CTYPE=C vim toclean.txt
UTF-8을 사용하려면 유니코드 터미널에서 Vim을 실행하세요.
다음을 사용하여 파일의 바이트를 표시할 수 있습니다.od
(POSIX) 또는hexdump
(BSD, Linux에서 일반적임).
od -t x1 toclean.txt
hexdump -C toclean.txt
hd toclean.txt
특정 바이트 값을 제거하려면 다음을 사용할 수 있습니다.tr
.
LC_CTYPE=C tr -d '\x83\xa5' toclean.txt >clean.txt
일부 UTF-8 문자를 확실히 제거하려면 tr
다음과 같이 UTF-8 인코딩이 있는 로케일에서 사용하십시오.
LC_CTYPE=en_US.utf8 tr -d '¥' toclean.txt >clean.txt
답변3
텍스트 파일에서 "ASCII가 아닌" 문자를 제거하기 위해 찾을 수 있는 가장 간단한 해결책은 다음과 같습니다.이 스레드.
$ tr -cd '\000-\777' <더티 파일> 클린 파일
'\000-\777'은 8진수 ASCII 세트를 정의합니다. "-c"는 "non-ASCII"라고도 알려진 주어진 세트를 보완하고 "-d"는 문자를 제거합니다.
답변4
그냥 사용할 수 있습니다 luit
. 목적은깨끗한터미널 텍스트는 시스템의 인코딩에 맞게 조정되며 유니코드를 올바르게 처리하지 않는 응용 프로그램과 터미널 사이에서 투명도 필터 역할을 합니다. 또는 그 반대의 경우도 마찬가지입니다.
거의 확실히 설치되어 있습니다. 호스트에서 인코딩 문제를 감지하면 자동으로 호출되기 X
때문에 표준으로 제공됩니다.xterm
해당 man
페이지에서는 다음과 상호 작용하는 예를 설명합니다 Emacs
.
luit
또한 시스템에서 일반적으로 사용되는 인코딩과 다른 인코딩이 내장되어 있거나 다국어 출력을 위해 레거시 이스케이프 시퀀스를 사용하려는 애플리케이션에도 유용합니다. 특히Emacs
UTF-8에서 제대로 작동하지 않는 버전은luit
다국어 출력에 사용할 수 있습니다.$ luit -encoding 'ISO 8859-1' emacs -nw
그런 다음
Emacs
,M-x set-terminal-coding-system RET iso-2022-8bit-ss2 RET
그러나 직접 터미널 애플리케이션 외에도 다음을 지원합니다.
-c Function as a simple converter from standard
input to standard output.
그럼 이렇게 사용될 수도 있겠네요...
luit -c <infile >outfile