sed를 사용하여 null 바이트를 제거하는 방법은 무엇입니까?


37

sed파일에서 널 바이트를 제거 하는 명령은 무엇입니까 ? 노력하고있어:

s/\000//g

그러나 그것은 0의 문자열을 제거합니다.

s/\x00//g

효과가없는 것 같습니다. sed스크립트 에서이 작업을 수행하려고 하므로 echo트릭이 작동 하는지 확실하지 않습니다 .

답변:


40

나는 이것을 어떻게 정확하게 달성 할 수 있는지 모르겠지만 다음과 함께 sed작동하는 솔루션입니다 tr.

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

이것은 sed어떤 경우에는 효과가 있지만 전부는 아닙니다.

sed 's/\x0//g' file1 > file2

이것은 모든 경우에 작동 해야하는 공백 문자로 교체하는 솔루션입니다.

sed 's/\x0/ /g' file1 > file2

10
그것은 매우 불완전한 답변처럼 보입니다. 왜 어떤 경우에는 작동하고 다른 경우에는 작동하지 않습니까? 그렇다면 예가 도움이되지 않습니까?
barlop

@ barlop : 구현 방식 때문에? OP는 하나를 지정하지 않았고 모든 단일 구현을 열거하지는 않습니다 ...
Tamara Wijsman

4
그렇다면 저에게 잘 들리므로 SED의 구현에 달려 있다고 말하고 있습니다. SED를 구현하면 파일의 데이터에 따라 한 파일에서 널을 제거하고 다른 파일이 아닌 널에서 제거 할 수 있다는 제안을 열어 놓았다고 말하지 않은 경우.
barlop

3
"tr -d '\ 000'<널이없는 파일> 널이없는 파일"이 아니어야합니까?
Seamus Abshere

1
나를 위해 작동합니다. 또한 유용한 : -i파일을 제자리로 변환하는 매개 변수.
zbyszek

8

tr내 파일의 다른 바이트를 sed넘어서서 아무것도 바꾸지 않았습니다. 나는 그것을 sed파이썬이 아니라 파이썬 에서 끝내 었습니다 .

f = open('file-with-0bytes.dump')
for l in f.readlines():
  print l.replace("\0", '')

파이프 형 원 라이너 는 다음과 같습니다 .

python -c 'import sys; sys.stdout.write(sys.stdin.read().replace("\0", ""))'

또한 일부 명령은 실제로 null 바이트를 남겨 두지 만 적어도 OSX 터미널에는 더 이상 표시되지 않습니다. 나는 hexdump이것을 디버깅 하는 데 사용 했다.


3

정규 표현식을 수행하기 위해 Perl을 사용하는 것은 매우 쉽습니다. 그냥 교체 sed와 함께 perl -np -e:

$ printf 'one\0two\0' | perl -np -e 's/\0/\n/g'
one
two

-n옵션을 사용하면 정규식은 sed와 같이 한 줄씩 실행됩니다.

0 바이트를 레코드 구분 기호로 사용하려면 Perl의 -0옵션을 사용하십시오.

$ printf 'one\0two\0' | perl -np0 -e 's/^/prefix /; s/\0/\n/g'
prefix one
prefix two
$ printf 'one\0two\0' | perl -np -e 's/^/prefix /; s/\0/\n/g'
prefix one
two

을 실행하여 Perl의 명령 행 옵션을 찾을 수 있습니다 perldoc perlrun.


1

null 바이트와 일치시키기 위해 Cygwin의 SED와 함께이 정규식을 사용합니다.

[^ \ x01- \ x7F]


이것은 GNUWin32에서 sed에 대한 질문에 대한 답변입니다. 실제로 널 이상을 제거합니다. 일치시키려는 항목 및 sed 구현에 따라 작동하지 않을 수도 있습니다.
Itsme2003
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.