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.