UNIX에서 널 문자 식별 및 제거


98

원치 않는 null 문자 (ASCII NUL, \0)가 포함 된 텍스트 파일이 있습니다. 내가 그것을 보려고 할 때 나는 일반 텍스트에 삽입 된 기호를 vi본다 ^@. 내가 어떻게 할 수있는:

  1. 파일에서 널 문자가 포함 된 행을 식별합니까? \0\x0에 대해 grepping을 시도했지만 작동하지 않았습니다.

  2. 널 문자를 제거 하시겠습니까? strings파일을 실행 하면 정리되었지만 이것이 최선의 방법인지 궁금합니다.


1
이런 종류의 질문은 아마도 SuperUser.com에 속할 것입니다
Olivier Lalonde

2
사실,이 질문은 superuser.com에 : superuser.com/questions/75130/how-to-remove-ths-symbol-with-vim
JRB

답변:


130

나는 사용합니다 tr:

tr < file-with-nulls -d '\000' > file-without-nulls

명령 인수 중간에 입력 리디렉션이 작동하는지 궁금하다면 작동합니다. 대부분의 쉘 인식하고 I 다룰 것입니다 / O 재 ( <, >, ...) 어디에서나 실제로 명령 줄입니다.


그리고 "diff file-with-nulls file-without-nulls"는 어떤 줄에 null 문자가 있는지 보여 주어야합니까? 예상보다 훨씬 더 많은 것을 되찾아줍니다.
dogbane

10
사실, 나는 그것이 있어야한다고 생각 tr -d '\000' < file-with-nulls > file-without-nulls하기 때문에 <쉘 파이프 기능의 일부이며 없습니다 tr.
Mikael S

9
대부분의 쉘은 실제로 인수 문자열의 어디에서나 <또는>를 인식하고 처리합니다. 저도 놀랐습니다.
pra

1
+1 대신 입력 리디렉션을 사용 cat |합니다. 훌륭하고 깨끗한 솔루션이 내 문제를 해결했습니다.
Krzysztof Jabłoński 2014

4
@Pointy '\ 000'은 tr에 대한 POSIX 오픈 그룹 사양에서 '\ 0'대신 사용됩니다. 즉, 선호하는 좋은 이유입니다
해롤드 피셔

67

파일에서 널 문자를 제거하려면 다음 sed 명령을 사용하십시오.

sed -i 's/\x0//g' null.txt

이 솔루션은 파일을 제자리에서 편집합니다. 파일이 아직 사용중인 경우 중요합니다. -i'ext '를 전달하면'ext '접미사가 추가 된 원본 파일의 백업이 생성됩니다.


6
참고 : FreeBSD (그리고 Mac OS X도 믿습니다)에서는 다음 인수에 확장자가 sed -i 필요 하지만 비어있을 수 있습니다. 이러한 시스템에서는 추가 ''같이 : sed -i '' 's/\x0//g "$FILE".
Tim Čas

1
이것은 tr나 보다 훨씬 빠릅니다
diachedelic

저에게는 Windows 용 Git 및 $ sed --version-> sed (GNU sed) 4.7를 사용하여 다음 호출을 사용하여 백업 파일을 example.csv.baksed -i.bak 's/\x0//g' example.csv
가져와야했습니다

1
@ TimČas 당신은 그것을 훌륭하게 해냈고, 하나를 놓쳤습니다. 그래서 그것은 sed -i '' 's / \ x0 // g'some_file.xml
Darko

@Darko 그래서 했어. 죄송합니다.
Tim Čas

22

원하지 않는 NUL 문자 (예 : 2 바이트마다 하나씩)는 파일이 UTF-16으로 인코딩되었으며 iconvUTF-8로 변환하는 데 사용해야 함 을 나타냅니다 .


1
응용 프로그램이 로깅되는 동안 디스크 공간이 부족했습니다. 이로 인해 이러한 문자가 생성됩니다.
dogbane

예를 들어 다음 명령을 사용하여 작동합니다 iconv -f UTF-16 -t UTF-8 file..
djule5

7

다음을 발견했는데 어떤 줄에 null 문자가 있는지 출력합니다.

perl -ne '/\000/ and print;' file-with-nulls

또한 8 진 덤프는 널이 있는지 알려줄 수 있습니다.

od file-with-nulls | grep ' 000'

5

파일의 줄이 \ r \ n \ 000으로 끝나면 \ n \ 000을 삭제 한 다음 \ r을 \ n으로 바꾸십시오.

tr -d '\n\000' <infile | tr '\r' '\n' >outfile

추신. Windows DOS 셸을 사용하는 경우 Sourceforge.net에서 GNU / win32 버전의 Unix 명령을 얻을 수 있습니다. 나는 항상 그들을 사용합니다. 파일에있는 내용을 분석하기 위해 8 진수 덤프 명령을 "od"확인하십시오 ...
wwmbes

2

다음은 ex(in-place)를 사용하여 NULL 문자를 제거하는 방법의 예입니다 .

ex -s +"%s/\%x00//g" -cwq nulls.txt

여러 파일의 경우 :

ex -s +'bufdo!%s/\%x00//g' -cxa *.txt

귀성을 위해 globbing 옵션을 사용할 수 있습니다 **/*.txt(셸에서 지원하는 경우).

sed-i매개 변수는 비표준 BSD 확장 이므로 스크립팅에 유용합니다 .

참조 : 파일이 바이너리 파일인지 확인하고 그렇지 않은 모든 파일을 읽는 방법?


1

나는 사용했다 :

recode UTF-16..UTF-8 <filename>

파일에서 0을 제거합니다.


0

다음과 같은 오류가 발생했습니다.

import codecs as cd
f=cd.open(filePath,'r','ISO-8859-1')

인코딩을 다음으로 변경하여 문제를 해결했습니다. utf-16

f=cd.open(filePath,'r','utf-16')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.