अशक्त बाइट्स को हटाने के लिए sed का उपयोग कैसे करें?


37

sedएक फ़ाइल से अशक्त बाइट्स को हटाने के लिए क्या है ? मैं कोशिश कर रहा हूँ:

s/\000//g

लेकिन वह शून्य के तारों को छीन रहा है।

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: इसे लागू करने के तरीके के कारण? ओपी ने एक निर्दिष्ट नहीं किया है और मैं हर एक कार्यान्वयन को लागू नहीं करने जा रहा हूं ...
तमारा विज्समैन

4
अच्छा तो यह मुझे ठीक लगता है, इसलिए आप कह रहे हैं कि यह SED के कार्यान्वयन पर निर्भर करता है। यदि आपने यह नहीं कहा था कि आपने संभावित सुझाव को छोड़ दिया होगा कि SED का एक कार्यान्वयन एक फ़ाइल से नल हटा सकता है और दूसरी फ़ाइल नहीं, तो फ़ाइल में डेटा के आधार पर।
बार्लोप

3
क्या यह "tr -d '\ 000' नहीं होना चाहिए <file-with-nulls> file-without-nulls"?
सीमस एबेल

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", ""))'

मैंने यह भी देखा कि कुछ कमांड वास्तव में अशक्त बाइट्स को छोड़ देते हैं लेकिन वे अब दिखाई नहीं देते हैं, कम से कम OSX टर्मिनल में नहीं। मैं hexdumpइस पर बहस करता था।


3

Regex करने के लिए Perl का उपयोग करना काफी आसान है। बस के sedसाथ बदलें perl -np -e:

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

-nविकल्प के साथ , रेगीक्स को सीड की तरह लाइन द्वारा चलाया जाता है।

यदि आप शून्य बाइट्स को रिकॉर्ड विभाजक के रूप में उपयोग करना चाहते हैं, तो पर्ल के -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

आप चलाकर पर्ल के कमांड-लाइन विकल्पों को देख सकते हैं perldoc perlrun


1

एक अशक्त बाइट से मिलान करने के लिए, मैं इस रेगेक्स का उपयोग सिगविन के SED के साथ करता हूं:

[^ \ X01- \ x7F]


यह GNUWin32 पर sed के लिए प्रश्न का उत्तर है। यह वास्तव में सिर्फ नल से अधिक स्ट्रिप्स करता है। यह आपके लिए काम कर सकता है या नहीं, जो आप मैच करना चाहते हैं और सेड के कार्यान्वयन पर निर्भर करता है।
इसकाme2003
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.