Jak używać seda do usuwania pustych bajtów?

37

Jaka jest sedinkantacja do usunięcia pustych bajtów z pliku? Próbuję:

s/\000//g

ale to jest usuwanie ciągów zer.

s/\x00//g

wydaje się nie mieć wpływu. Próbuję to zrobić w sedskrypcie, więc nie jestem pewien, czy echosztuczka zadziała.

Chris Curvey
źródło

Odpowiedzi:

40

Nie wiem, jak dokładnie to osiągnąć sed, ale jest to rozwiązanie, które działa z tr:

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

Jest to rozwiązanie, sedktóre działa w niektórych przypadkach, ale nie we wszystkich:

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

Jest to rozwiązanie polegające na zamianie na znaki spacji, które powinny działać we wszystkich przypadkach:

sed 's/\x0/ /g' file1 > file2
Tamara Wijsman
źródło
10
to wygląda na bardzo niepełną odpowiedź. dlaczego miałoby to działać w niektórych przypadkach, a nie w innych, a jeśli tak, to czy przykład nie byłby przydatny?
barlop
@barlop: Ze względu na sposób implementacji? OP nie określił jednego i nie będę wyliczał każdej implementacji ...
Tamara Wijsman
4
Cóż, to brzmi dla mnie dobrze, więc mówisz, że to zależy od implementacji SED. Jeśli nie powiedziałeś, że pozostawiłeś otwartą możliwą sugestię, że jedna implementacja SED może usunąć wartości null z jednego pliku, a nie innego pliku, w zależności od danych w pliku.
barlop
3
nie powinien to być „tr -d '\ 000' <plik-z-zerami> plik-bez-zerami?
Seamus Abshere
1
Działa dla mnie ™. Przydatny również: -iparametr do konwersji pliku na miejscu.
zbyszek 19.04.16
8

trpotknął się o kilka innych bajtów w moim pliku i sedniczego nie zastąpił. Skończyło się na tym, że nie robiłem tego, sedale w Pythonie:

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

Oto jednorurowa rura z rurami :

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

Zauważyłem również, że niektóre polecenia faktycznie pozostawiają tam bajty zerowe, ale nie są już widoczne, przynajmniej nie w terminalu OSX. Użyłem hexdumpdo debugowania to.

finanse fifi
źródło
3

Perl jest dość łatwy do wykonania wyrażenia regularnego. Wystarczy wymienić sedz perl -np -e:

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

Dzięki tej -nopcji wyrażenia regularne są uruchamiane wiersz po wierszu, podobnie jak sed.

Jeśli chcesz używać zerowych bajtów jako separatorów rekordów, użyj -0opcji Perla .

$ 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

Możesz sprawdzić opcje wiersza polecenia Perla, uruchamiając perldoc perlrun.

Flimm
źródło
1

Aby dopasować bajt zerowy, używam tego wyrażenia regularnego z SED Cygwina:

[^ \ x01- \ x7F]

Big Daddy
źródło
To jest odpowiedź na pytanie sed dla GNUWin32. W rzeczywistości usuwa więcej niż tylko wartości zerowe. To może, ale nie musi, działać w zależności od tego, co chcesz dopasować, i implementacji sed.
Itsme2003