Boş bayt kaldırmak için sed nasıl kullanılır?


37

sedBoş baytları bir dosyadan kaldırma isteği nedir ? Deniyorum:

s/\000//g

ama bu sıfır dizelerini soyuyor.

s/\x00//g

etkisi yok gibi görünüyor. Bunu bir sedkomut dosyasında yapmaya çalışıyorum , bu yüzden echohilenin işe yarayacağından emin değilim .

Yanıtlar:


40

Bunu tam olarak nasıl başarabildiğini bilmiyorum sed, ama bu işe yarayan bir çözüm tr:

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

Bu, sedbazı durumlarda işe yarayan bir çözümdür, hepsinde değil:

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

Bu, her durumda çalışması gereken boşluk karakterlerine değiştirmeyi içeren bir çözümdür:

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

10
çok eksik bir cevap gibi görünüyor. neden bazı durumlarda çalışır, diğerleri olmaz ve öyleyse bir örnek faydalı olmaz mı?
— barlop

@ barlop: Uygulanma şekli yüzünden mi? OP bir tane belirlemedi ve her bir uygulamayı numaralandırmayacağım ...
— Tamara Wijsman

4
Öyleyse bana iyi geliyor, SED'in uygulanmasına bağlı olduğunu söylüyorsun. SED'in bir uygulamasının, dosyadaki verilere bağlı olarak başka bir dosyadan değil, bir dosyadan boşları kaldıracağı olasılığını açık bırakacağınızı söylememiş olsaydınız.
— barlop

3
"tr -d '\ 000' <null'lu dosya> null olmayan dosya" olmamalı mıydı?
— Seamus Abshere,

1
Benim için çalışıyor ™. Ayrıca yararlı: -iyerinde dosyayı dönüştürmek için parametre.
— zbyszek

8

trDosyamdaki diğer baytların üzerinde tetiklendi ve sedhiçbir şeyin yerini almadı. Ben değil sedPython'da yaparak bitirdim:

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

İşte akla gelebilecek tek astar:

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

Ayrıca bazı komutların gerçekte boş baytları orada bıraktığını fark ettim ancak artık OSX terminalinde görünmüyorlar. Bunu hexdumphata ayıklamak için kullanılır .


3

Bir regex gerçekleştirmek için Perl kullanmak oldukça kolaydır. Sadece değiştirmek sedile perl -np -e:

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

İle -nseçeneği, regexes sed gibi, satır satır çalıştırılır.

Kayıt ayırıcı olarak sıfır bayt kullanmak istiyorsanız, Perl -0seçeneğini kullanın.

$ 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

Çalıştırarak Perl'in komut satırı seçeneklerini arayabilirsiniz perldoc perlrun.


1

Boş bir bayt eşleştirmek için bu regex'i Cygwin's SED ile kullanıyorum:

[^ \ X01- \ x7F]


Bu GNUWin32'deki sed için verilen sorunun cevabı. Aslında sadece sıfırdan daha çok şeyden sıyrılıyor. Ne eşleştirmek istediğinize ve sed uygulamasına bağlı olarak sizin için çalışmayabilir veya çalışmayabilir.
— Itsme2003
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.