Mam plik tekstowy zawierający niechciane znaki null (ASCII NUL, \0
). Kiedy próbuję to zobaczyć, vi
widzę ^@
symbole przeplatane zwykłym tekstem. Jak mogę:
Zidentyfikować, które wiersze w pliku zawierają znaki puste? Próbowałem grepować dla
\0
i\x0
, ale to nie zadziałało.Usunąć znaki puste? Uruchomienie
strings
na pliku wyczyściło go, ale zastanawiam się tylko, czy to najlepszy sposób?
unix
shell
null
special-characters
dogbane
źródło
źródło
Odpowiedzi:
Użyłbym
tr
:tr < file-with-nulls -d '\000' > file-without-nulls
Jeśli zastanawiasz się, czy przekierowanie wejścia w środku argumentów poleceń działa, to działa. Większość muszle będą rozpoznawać i radzić sobie z I / O przekierowania (
<
,>
...) w dowolnym miejscu w wierszu poleceń, faktycznie.źródło
tr -d '\000' < file-with-nulls > file-without-nulls
ponieważ<
jest częścią funkcji rury powłoki, a nietr
.cat |
. Dobre, czyste rozwiązanie i rozwiązało mój problem.Użyj następującego polecenia sed, aby usunąć znaki null z pliku.
sed -i 's/\x0//g' null.txt
to rozwiązanie edytuje plik w miejscu, co jest ważne, jeśli plik jest nadal używany. przekazanie -i'ext 'tworzy kopię zapasową oryginalnego pliku z dodanym przyrostkiem' ext '.
źródło
sed -i
wymaga rozszerzenia w następnym argumencie, ale może być puste. W tych systemach, dodać''
, na przykład:sed -i '' 's/\x0//g "$FILE"
.tr
dla mnie$ sed --version
->sed (GNU sed) 4.7
, musiałem użyć następującego wywołania, aby uzyskać plik kopii zapasowej o nazwieexample.csv.bak
:sed -i.bak 's/\x0//g' example.csv
Duża liczba niechcianych znaków NUL, powiedzmy jeden co drugi bajt, wskazuje, że plik jest zakodowany w UTF-16 i że należy go użyć
iconv
do konwersji do UTF-8.źródło
iconv -f UTF-16 -t UTF-8 file
.Odkryłem następujące, które wypisuje, które wiersze, jeśli w ogóle, mają znaki puste:
perl -ne '/\000/ and print;' file-with-nulls
Ponadto zrzut ósemkowy może powiedzieć, czy występują wartości null:
od file-with-nulls | grep ' 000'
źródło
Jeśli wiersze w pliku kończą się na \ r \ n \ 000, to działa usunięcie \ n \ 000, a następnie zastąpienie \ r \ n.
tr -d '\n\000' <infile | tr '\r' '\n' >outfile
źródło
Oto przykład, jak usunąć znaki NULL za pomocą
ex
(w miejscu):ex -s +"%s/\%x00//g" -cwq nulls.txt
i dla wielu plików:
ex -s +'bufdo!%s/\%x00//g' -cxa *.txt
Dla rekurencyjności możesz użyć opcji globbingu
**/*.txt
(jeśli jest obsługiwana przez twoją powłokę).Przydatne do tworzenia skryptów, ponieważ
sed
jego-i
parametr jest niestandardowym rozszerzeniem BSD.Zobacz też: Jak sprawdzić, czy plik jest plikiem binarnym i czytać wszystkie pliki, które nim nie są?
źródło
Użyłem:
aby pozbyć się zer w pliku.
źródło
Napotkałem ten sam błąd z:
import codecs as cd f=cd.open(filePath,'r','ISO-8859-1')
Rozwiązałem problem, zmieniając kodowanie na
utf-16
f=cd.open(filePath,'r','utf-16')
źródło