Як поздоровитись за спеціальним символом NUL (^ @ ^ @ ^ @)


26

Файл:

O000000667520994000000074720121112000000N^@^@^@ 

Я використав команду нижче, але вона не працює.

grep "^@^@^@" *
linux  unix 

Відповіді:


52

Ви можете переглядати будь-які символи, включаючи символи керування / недрукувальні в режимі perl-regexp (-P), використовуючи його шістнадцятковий код:

grep -Pa '\x00' ...

5
Ви можете додати -aопцію, інакше grepвін вважає, що це двійкові дані, і не буде відображати відповідні рядки.
mpy

Я не можу знайти спосіб перевірити, чи містить файл лише ASCII = 0 байт ... grep -Pv '\x00' fileЧи не працює в Cygwin ...
пісень

@mpy Без -a(іноді?) вона навіть не знаходить шаблону. Спасибі! Може допомогти @pbies також.
Мішель де Руйтер

13

^@- це не карат ^і підпис @, це один символ. Оскільки деякі програми відображають символ NUL - значення ASCII 0, також відоме як \0C.

Тут я створив файл з байтом NUL. Зауважте, що я використовую cat -vдля показу недрукувальних символів.

$ cat -v blah
hello
null^@
hi
$ hexdump -C blah
00000000  68 65 6c 6c 6f 0a 6e 75  6c 6c 00 0a 68 69 0a     |hello.null..hi.|
0000000f

У Grep є проблеми з пошуком NUL, оскільки вони використовуються для завершення рядків у C. Sed, однак, може зробити цю роботу:

$ sed -n '/\x0/p' blah
null
$ sed -n '/\x0/p' blah | cat -v
null^@

In vi, у режимі вставки натисніть Ctrl- V, Ctrl- Shift-, @щоб вставити нульовий байт.


3

Якщо grep -Pце не працює (наприклад, на OS X), спробуйте це:

grep -E '\x00' ...

Ви впевнені, що це працює? Я не мою версію: grep (GNU grep) 2.14
guettli

3
Ця відповідь призначена для BSD grep, спробуйте головну відповідь для GNU grep:grep -Pa '\x00' ...
robinst

1

У bash ви можете додавати спеціальні символи, якщо вони мають префікс з C-qабо C-v. Так можна, наприклад

grep 'Ctrl-vCtrl-a' file.txt

Рядок пошуку слід читати як control key+ character v, а потім control key+ character a, який шукає значення ASHII SOH (01). На жаль, це не працює для символу NUL.


Імовірно, ви насправді не означаєте, що таку послідовність символів слід виписати буквально, а натомість логічно вводити її на клавіатурі?
Гонки легкості з Монікою

Так, звісно. Це утримувана клавіша управління, натисніть v, потім утримуйте клавішу Control, натисніть a.
Олаф Дієтше

Я думаю, що це незрозуміло у вашій відповіді.
Легкі перегони з Монікою

@LightnessRacesinOrbit Дякую за підказку. Я намагався уточнити у відповіді.
Олаф Дієтше

@JohnKugelman Дякую за редагування Здається, я повинен був уважніше придивитися до допомоги.
Олаф Дієтше


-3

Символ ^ @ - це символ NUL, тому я боюся, що його неможливо отримати безпосередньо.

Найкращим варіантом буде, мабуть, написати просту програму, яка шукає цю послідовність байтів.

Як альтернативи ви можете спробувати перетворити його в який - якій формі шістнадцятирічного дампа ( od, xxdабо так) і Grep на вихід цього. Але, чесно кажучи, було б складно виправити це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.