정크문자 삭제~G

정크문자 삭제~G

파이프 "|" 구분 기호로 유닉스 CSV 파일이 있습니다. 그런데 vi 편집기에서 열면 ~G 형태의 추가 문자가 몇 개 있습니다. 하지만 고양이를 할 때는 ~G 문자가 전혀 보이지 않습니다.

여기에 이미지 설명을 입력하세요.

453136~G|OORAHASS0343136~G|범용 박스 액세스~G|NMBLDD~G|/rack=0/slot=1/port=7~G|20Mbit/s~G|80Mbit/s~G|IS

~G 문자를 제거하는 방법.

다음 단계를 시도했지만 운이 없습니다.

sed -e 's/[^ -~]//g' file_in > file_out

또는

grep -c '[^ -~]' file_in 

또는

sed -i 's/\~H//g;s/\~G//g' file_in

답변1

cat -e0x87바이트(8진수로는 0207) 로 렌더링합니다 M-^G. 문서 1 에서 알 수 있듯이 vim옵션이 유니코드이고 문자가 유효한 UTF-8 시퀀스의 Forms 부분이 아닌 경우 바이트 0x87이 렌더링됩니다. (ASCII BEL 문자인 0x7을 렌더링합니다.)~Gencoding<87>encoding^G

G(ASCII에서는 0x47) 비트 7(요소)은 1로 설정되고 비트 6은 0(제어)으로 설정됩니다. 이 바이트는 UTF-8에서 유효한 문자를 구성하지 않으며 일반적으로 제어 문자(ESA) ISO8859-x 문자 집합의 C1 집합에 있습니다.

그것을 제거하려면 다음을 수행할 수 있습니다.

tr -d '\207' < file > file.new

GNU sed및 ksh93/zsh/bash와 같은 셸을 사용하여 다음을 지원합니다 $'...'.

sed -i $'s/\207//g' file

당신의

sed 's/[^ -~]//g'

이렇게 하는 것이 가능하지만 C 로케일에서만 가능합니다. 다른 로케일에서 일치하는 문자 범위는 매우 무작위입니다. 그래서:

LC_ALL=C sed 's/[^ -~]//g' < file > file.new

(TAB 및 CR(LF 제외) 및 비ASCII 문자를 포함한 다른 모든 제어 문자가 제거됩니다.)

0x87은 windows-1252 문자 집합에서 ‡입니다(때때로 latin1 또는 iso8859-1로 잘못 호출됨).

로케일의 문자 집합에서 해당 0x87을 ‡로 변환하려는 경우(예를 들어 이러한 파일은 Windows 세계에서 왔으며 0x87의 용도이기 때문에)(해당 문자가 있다고 가정) 다음을 사용할 수 있습니다.

iconv -f windows-1252 < file > file.new

1 브람 ​​멀레나(2011-03-22). '인쇄 중'. "옵션".VIM 참조 매뉴얼.

답변2

coreutils의 도구만 사용하십시오.

# Generate a test file
printf 'head\207\nsome text\207\nnew line' > /tmp/test.cchar

# And filter with tr
tr -d "\207" < /tmp/test.cchar > /tmp/test.filtered 

답변3

이것은 ~G종 문자 ASCII 007입니다. 파일을 삭제하고 해당 위치에서 파일을 업데이트하는 쉬운 방법은 다음과 같습니다.

perl -pi -e 's/\007//' file_in

또한보십시오ASCII 테이블

더 복잡한 sed해결책은 쉘 대체를 사용하는 것입니다.

sed -i 's/'`echo "\007"`'//' file_in

사용 시 인쇄되지 않는 문자를 표시하는 옵션을 cat추가합니다 .-e

관련 정보