Plik:
O000000667520994000000074720121112000000N^@^@^@
Użyłem poniższego polecenia, ale to nie działa.
grep "^@^@^@" *
Możesz grep dla dowolnych znaków, w tym znaków sterujących / niedrukowalnych w trybie perl-regexp (-P) za pomocą kodu szesnastkowego:
grep -Pa '\x00' ...
-a
opcję, w przeciwnym raziegrep
uważasz, że są to dane binarne i nie będą wyświetlać pasujących wierszy.grep -Pv '\x00' file
nie działa w Cygwin ...-a
(czasem?) nawet nie znajduje wzorca. Dzięki! Może pomóc również @pbies.^@
nie jest karatem^
i znakiem@
, to jedna postać. W ten sposób niektóre programy wyświetlają znak NUL - wartość 0 ASCII, znana również jako\0
C.Tutaj utworzyłem plik z bajtem NUL. † Zauważ, że używam
cat -v
do wyświetlania znaków niedrukowalnych.Grep ma problem ze znalezieniem wartości NUL, ponieważ są one używane do zakończenia ciągów znaków w C. Sed, jednak może wykonać to zadanie:
† W trybie vi, w trybie wstawiania naciśnij Ctrl- V, Ctrl- Shift-, @aby wstawić bajt zerowy.
źródło
Jeśli
grep -P
nie działa (np. W systemie OS X), spróbuj tego:źródło
grep -Pa '\x00' ...
W bash możesz dodawać znaki specjalne, gdy są poprzedzone znakiem
C-q
lubC-v
. Możesz na przykładWyszukiwany ciąg należy odczytać jako
control key
+character v
, a po nimcontrol key
+character a
, który wyszukuje wartość ASCII SOH (01). Niestety nie działa to dla postaci NUL.źródło
^ @ jest znakiem NUL. Co chcesz zrobić z wierszami plików, które go zawierają?
Możesz zajrzeć na /programming/2398393/identifying-and-removing-null-characters-in-unix, który dotyczy podobnego problemu.
źródło
Znak ^ @ jest znakiem NUL, więc obawiam się, że nie można go bezpośrednio grepować.
Najlepszą opcją byłoby prawdopodobnie napisanie prostego programu, który szuka tej sekwencji bajtów.
Alternatywnie można spróbować przekształcić go w jakiejś formie zrzutu szesnastkowego (
od
,xxd
lub tak) i grep do wyjścia z niego. Ale szczerze mówiąc, trudno byłoby to naprawić.źródło