Mam niektóre pliki, które są uszkodzone za pomocą tego symbolu:
^ @
To nie jest część ciągu; nie można przeszukiwać. Jak zastąpić ten symbol niczym lub jak usunąć ten symbol?
Oto przykładowy wiersz z jednego pliku:
^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@
źródło
Nie sądzę, że twoje pliki są uszkodzone. Twój przykładowy wiersz wygląda tak, jakby zawierał zwykły tekst z pustymi bajtami między każdym znakiem. To sugeruje, że jest to plik tekstowy zakodowany w UTF-16, ale na początku pliku brakuje znaku kolejności bajtów. Zobacz http://en.wikipedia.org/wiki/Byte-order_mark
Załóżmy, że otwieram Notatnik, wpisuję słowo „nazwa pliku” i zapisuję jako Big-endian w Unicode. Zrzut szesnastkowy tego pliku wygląda następująco:
Jeśli otworzę ten plik w Vimie, wygląda dobrze - bajty „fe ff” informują Vima, w jaki sposób plik jest kodowany. Załóżmy teraz, że tworzę plik zawierający dokładnie tę samą sekwencję bajtów, ale bez wiodącego „fe ff”. Vim wstawia ^ @ (lub <00>, w zależności od konfiguracji) zamiast bajtów pustych; Notatnik wstawia spacje.
Zamiast więc usuwać wartości zerowe, powinieneś naprawdę chcieć, aby Vim poprawnie zinterpretował plik. Możesz poprosić Vima o ponowne załadowanie pliku z poprawnym kodowaniem za pomocą polecenia:
źródło
W rzeczywistości działało to dla mnie w vimie:
źródło
<Ctrl-V><Ctrl-2>
(tak jak ten z<Ctrl-Shift-2>
) pracować, ale to zadziałało.Ten „symbol” reprezentuje znak NULL o wartości ASCII 000.
Vim jest trudny do usunięcia, spróbuj
źródło
Jak zauważyli inni, są to bajty zerowe (ASCII 00). W systemie Linux sposobem wprowadzania wartości ASCII w vim jest naciśnięcie klawiszy Ctrl-V, a następnie 3-cyfrowej wartości ósemkowej dowolnego znaku. Aby zastąpić wszystkie bajty puste, użyj:
:%s/
Ctrl-V000//g
(bez spacji).
Podobnie możesz wyszukiwać wartości null za pomocą:
/
Ctrl-V000
W obu przypadkach nie będą wyświetlać zer podczas pisania, ale po wpisaniu wszystkich trzech wyświetli się
^@
. Na kolorowych terminalach pokaże to na niebiesko, aby wskazać, że jest to znak kontrolny.źródło
FWIW, w moim przypadku musiałem użyć vima na cygwin do edycji pliku tekstowego utworzonego na komputerze Mac. Przyjęte rozwiązanie nie działało dla mnie, ale było blisko. Według strony wiki Vima na temat pracy z Unicode , istnieje różnica między wersjami BOM Big Endian i Little Endian. Musiałem więc wyraźnie powiedzieć,
vim
aby użyć wersji kodowania BOM Little Endian.Dopiero po wybraniu odpowiedniego kodowania przekonwertowałem format pliku (zakończenia linii), aby
dos
móc edytować plik w edytorze Windows. Próba ustawienia zresetowania formatu pliku przed określeniem kodowania wywołała u mnie smutek. Oto pełna lista poleceń, których użyłem:źródło
Przyjęte rozwiązanie nie działało dla mnie.
tr
Zamiast tego utworzyłem vim potok pliku :Działa to również dobrze w trybie wizualnym (po prostu wpisz
:!tr -d '\000'
) lub w szeregu linii:źródło
^@
niezły znak, jeśli używasz właściwego kodowania, ale jeśli chcesz go usunąć, spróbuj:tr -d '\000'
sed 's/\000//g'
Aby przekonwertować plik na format Unix / Linux przed jakimkolwiek przetwarzaniem, spróbuj:
dos2unix filename
- rhel i innedos2ux filename [newfilename]
- HP-UXźródło
Oprócz odpowiedzi @ jrb w Vimie wykrywane jest kodowanie znaków pliku na podstawie opcji kodowania plików. (zwróć uwagę na „s” na końcu kodowania plików)
Tj. W systemie Windows domyślną wartością
fileencodings
opcji jestucs-bom
, co oznacza:sprawdź, czy BOM istnieje na początku pliku.
Jeśli BOM istnieje, to „odczytaj kodowanie pliku z BOM”.
Jeśli BOM nie istnieje (w tym przypadku oznaczałoby to również, że wszystkie kodowania znaków określone w
fileencodings
opcji nie pasują), to przeczytaj plik z kodowaniem znaków określonym wencoding
opcji. Domyślne kodowanie znaków dla tejencoding
opcji jest:latin1
. Ponieważ kodowanielatin1
jest jednobajtowe , wszystkie bajty w pliku są poprawnymilatin1
znakami (nawetNul
znak^@
, który widzisz *).* - właściwie
^@
to znak nowej linii w tekście bufora Vima, a nie znak Nul.Właściwym sposobem na odczytanie pliku jest ręczne wpisanie kodowania znaków jako UTF-16 (ponieważ wygląda na to, że UTF-16 jest w tym przypadku właściwym kodowaniem znaków).
źródło