vim으로이“^ @”기호를 제거하는 방법은 무엇입니까?


59

이 기호로 손상된 파일이 있습니다.

^ @

문자열의 일부가 아닙니다. 검색 할 수 없습니다. 이 기호를 아무 것도 대신 사용하거나이 기호를 어떻게 삭제합니까?

다음은 한 파일의 예제 행입니다.

^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@

답변:


51

시도해 볼 수 있습니다 :

  • %s/<CTRL-2>//g (일반 PC)

  • %s/<CTRL-SHIFT-2>//g (Mac PC에서)

어디서 <CTRL-2>다운을 누르는 것을 의미 CTRL눌려로 유지하는 일반 PC에서를, 공격 2, 릴리스 CTRL.

그리고 <CTRL-SHIFT-2>먼저 controlMac PC에서 눌린 상태를 shift유지하고 Mac PC를 눌렀을 때 누른 상태 2, 눌렀다 놓기 control및 놓기 상태를 유지하는 것을 의미합니다 shift.

마지막으로 두 명령 모두 %s/^@//g화면에 나타납니다. ^@는 단일 문자 (NULL 바이트, 그렇지 않으면 표시 할 수 없음)를 의미하며 ^뒤에 오는 문자가 아니므로 위 명령에서 @입력 ^하고 @한 행에 넣을 수 없습니다 .

이 명령은 모든을 제거합니다 ^@.


4
관련 링크를 통해이 질문 / 답변을 우연히 발견했습니다 : 이것은 실제로 나쁜 충고이며 매우 적은 경우에만 제대로 작동합니다. null 바이트를 제거하는 대신 실제로 인코딩을 변경하는 것이 좋습니다. 널 바이트를 제거해도 가비지로 표시되는 다른 멀티 바이트 문자가 여전히있을 수 있습니다.
Mario

@Mario 인코딩 변경에 대해 더 자세히 말씀해 주시겠습니까? 아래 jrb의 답변과 관련이 있습니까?
George

아래 rpyzh의 답변을 참조하십시오. 올바른 인코딩을 사용하여 파일을로드하고 다른 파일로 저장하는 방법을 보여줍니다 (응답에 대한 자세한 설명이 필요할 수 있음). Jrb의 마지막 메모는 읽기만한다면 충분하지만 다른 인코딩을 사용하여 널 바이트없이 저장하려는 경우에는 충분하지 않습니다.
마리오

50

파일이 손상되었다고 생각하지 않습니다. 예제 줄에는 각 문자 사이에 null 바이트가있는 일반 텍스트가 포함 된 것처럼 보입니다. 이것은 UTF-16으로 인코딩 된 텍스트 파일이지만 파일의 시작 부분에서 바이트 순서 표시가 누락되었음을 나타냅니다. http://en.wikipedia.org/wiki/Byte-order_mark 참조

메모장을 열고 'filename'이라는 단어를 입력하고 유니 코드 Big-endian으로 저장한다고 가정 해 봅시다. 이 파일의 16 진 덤프는 다음과 같습니다.

fe ff 00 66 00 69 00 6c 00 65 00 6e 00 61 00 6d 00 65

이 파일을 Vim에서 열면 괜찮아 보입니다- 'fe ff'바이트는 Vim에게 파일이 어떻게 인코딩되는지 알려줍니다. 이제 정확히 동일한 바이트 시퀀스를 포함하지만 선행 'fe ff'가없는 파일을 작성한다고 가정하십시오. Vim은 널 바이트 대신 ^ @ (또는 구성에 따라 <00>)을 삽입합니다. 메모장은 공백을 삽입합니다.

따라서 null을 제거하는 대신 Vim이 파일을 올바르게 해석하도록 유도해야합니다. Vim이 다음 명령을 사용하여 올바른 인코딩으로 파일을 다시로드 할 수 있습니다.

:e ++enc=utf16


예, 마지막 명령으로 vim은 파일을 올바르게 해석하지만 널 바이트는 제거하지 않습니다.
mrt181

6
그들을 제거하려면 다른 인코딩을 선택하고 파일을 다시 저장 : 설정 fenc = UTF-8
SCY

35

이것은 실제로 vim 내에서 나를 위해 일했습니다.

:%s/\%x00//g

5
이것은 replacement ()와 함께 작동하지만 Ctl-VCtl-Shift-2는 작동하지 않습니다.
dsummersl

나에게도 같은 문제가 있지만 <Ctrl-V><Ctrl-2>(와 함께뿐만 아니라 <Ctrl-Shift-2>) 작동하지 못했지만 이것이 효과가있었습니다.
Jeff Bridgman

5
이것은 나를 위해 리눅스에서 작동합니다. '00'는 명령 모드 (ASCII 얻을 "생각) 또는 위에 커서를 놓고 '조지아'를 입력하여 정력의 모든 문자를 찾을 수있는 ASCII 16 진수 값입니다 :. 명령 행에서 ASCII : /와 같은 정력 .wikia.com / wiki /…
Casey Jones

^ Vx00도 작동합니다. ^ VuXXXX와 함께 16 비트 유니 코드를 입력 할 수도 있습니다. 검색에서 \ % uXXXX를 시도했지만 작동했습니다.
Edward Falk 2018 년

당신은 끝까지 내 사랑하는 사람이 될 것입니다. 내 마음 깊은 곳에서 ... 감사합니다!
Gonzalo Cao

12

이 '기호'는 ASCII 값이 000 인 NULL 문자를 나타냅니다.

vim으로 제거하기가 어렵습니다.

tr -d '\000' < file1 > file2

7

다른 사람들이 지적했듯이, 이들은 null 바이트입니다 (ASCII 00). Linux에서 vim에 ASCII 값을 입력하는 방법은 Ctrl-V를 누른 다음 임의의 문자의 3 ​​자리 8 진 값을 누르는 것입니다. 모든 널 바이트를 바꾸려면 다음을 사용하십시오.

    :%s/Ctrl-V000//g

(공백 없음).

마찬가지로 다음을 사용하여 null을 검색 할 수 있습니다.

    /Ctrl-V000

두 경우 모두 0을 입력 할 때 0이 표시되지 않지만 3 개를 모두 입력하면가 표시됩니다 ^@. 컬러 터미널에서는 파란색으로 표시되어 제어 문자임을 나타냅니다.


6

FWIW, 내 경우에는 cygwin에서 vim을 사용하여 Mac에서 만든 텍스트 파일을 편집해야했습니다. 받아 들여진 해결책은 나를 위해 작동하지 않았지만 가깝습니다. Unicode 작업에 관한 Vim 위키 페이지에 따르면 BOM 바이트의 Big Endian 버전과 Little Endian 버전간에 차이가 있습니다. 따라서 vimLittle Endian 버전의 BOM 인코딩을 사용 하도록 명시 적으로 지시해야했습니다 .

올바른 인코딩을 선택한 후에 만 ​​파일 형식 (줄 끝)을 변환하여 dosWindows 편집기에서 파일을 편집 할 수있었습니다. 인코딩을 지정하기 전에 파일 형식을 재설정하려고하면 슬픔이 생겼습니다. 내가 사용한 전체 명령 목록은 다음과 같습니다.

:e ++enc=utf16le
:w!
:e ++ff=mac
:setlocal ff=dos
:wq

소중한 정보. 필자의 경우 BOM 바이트의 엔디안이었습니다.
Andre Albuquerque

3

받아 들여진 해결책이 효과가 없었습니다. tr대신 vim 파이프를 통해 파일을 만들었습니다 .

:%!tr -d '\000'

이것은 시각적 모드 (type 만 :!tr -d '\000') 또는 여러 줄에서 잘 작동 합니다.

# Remove nulls from current line:
:.!tr -d '\000'

# Remove nulls from lines 3-5:
:3,5!tr -d '\000'

2

^@ 적절한 인코딩을 사용하는 경우 나쁜 문자가 아니지만 제거하려면 다음을 시도하십시오.

  • tr -d '\000'
  • sed 's/\000//g'

^ M 문자는 예제 데이터에 있습니다

처리하기 전에 파일을 Unix / Linux 형식으로 변환하려면 다음을 시도하십시오.

dos2unix filename -rhel 및 기타

dos2ux filename [newfilename] -HP-UX


1

@jrb의 답변 외에도 Vim에서 파일의 문자 인코딩은 fileencodings 옵션을 기반으로 감지됩니다. (파일 인코딩의 끝에 's'를 기록하십시오)

즉, Windows의 경우 fileencodings옵션 의 기본값 ucs-bom은입니다.

파일 시작 부분에 BOM이 있는지 확인하십시오.

BOM이 있으면 'BOM에서 파일의 문자 인코딩을 읽으십시오'.

BOM이 존재하지 않는 경우 (이 경우 fileencodings옵션에 지정된 모든 문자 인코딩 이 일치하지 않음을 의미하는 경우 ) encoding옵션에 지정된 문자 인코딩으로 파일을 읽으십시오 . encoding옵션 의 기본 문자 인코딩 은 다음과 같습니다 latin1. 이제 때문이 latin1는 IS 한 바이트 길이 문자 인코딩은, 모든 파일의 바이트 유효 latin1문자 (심지어 Nul문자 ^@는 *보고있다).

*-실제로, ^@Nul 문자가 아닌 Vim의 버퍼 텍스트에서 개행 문자입니다.

파일을 읽는 올바른 방법은 문자 인코딩을 UTF-16으로 수동으로 지정하는 것입니다 (UTF-16이이 경우 적절한 문자 인코딩 인 것처럼 보입니다).

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