Отметив, что $'...'
является конструкцией кавычек оболочки, ,
$ echo 'ABCabc<>/ă' | grep -o [$'\x00'-$'\x7f']
попытается передать буквальный символ NUL как часть аргумента командной строки в grep
. Это невозможно сделать в любой Unix-подобной системе, поскольку аргументы командной строки передаются процессу в виде строк с нулевым завершением. Таким образом, grep
видит только аргументы -o
и [
.
Вам нужно будет создать некоторый шаблон, который соответствует байту NUL, не включая его буквально. Но я не думаю, что grep
поддерживает экранирование \000
или \x00
. Однако Perl это делает, поэтому он печатает строку ввода с NUL:
$ printf 'foo\nbar\0\n' |perl -ne 'print if /\000/'
bar
Кроме того, по крайней мере, GNU grep, похоже, не нравится такое выражение диапазона, поэтому, если бы вы использовали это, вы должны были бы сделать что-то другое. В локали C
[[:cntrl:][:print:]]'
, возможно, может соответствовать символам от \x01
до \x7f
, но я не проверял всесторонне. руководство по grep содержит некоторые описания классов.
Также обратите внимание, что [$'\x00'-$'\x7f']
имеет пару [
и ]
без кавычек, а значит, является шаблоном оболочки. Это не связано с байтом NUL, но если у вас есть файлы, соответствующие глобусу (любые однобуквенные имена, если глобус работает в вашей системе — он не работает в моем Linux), или если были установлены failglob
или nullglob
, это, вероятно, даст нежелательные результаты. Вместо этого также укажите скобки: $'[\x00-\x7f]'
.
person
ilkkachu
schedule
01.03.2021