2016-11-24 5 views
0

GNU Баш, версия 4.3.42 (1) -релиз, вырезая на нулевой символ в переменной

Попытка deliminate на нулевой символ, но удар не кажется, держать нулевой символ в переменной ,

$ echo -e 'hello\0goodbye' > testlist 
$ cat testlist | cut -d '' -f1 
hello 
$ foobar=$(echo -e 'hello\0goodbye'); echo "$foobar" | cut -d '' -f1 
hellogoodbye 

Есть ли что-то, что я делаю неправильно?

+0

Почему вы думаете, что '' '' является нулевым символом? –

+1

@ Miati, да. По моему опыту, оболочка не может содержать нулевой символ в переменной. Другие команды, такие как 'find' и' xargs', не имеют проблем. Однако оболочка может даже обрабатывать нулевой символ как часть строки, как вы можете видеть на выходе этой командной строки: 'echo -e 'A \ 0B' | od -tx1' – Jdamian

+2

@Miati, я думаю, bash не может сохранить нулевой символ в переменной, потому что он используется как символ разделителя конца строки в C. – Jdamian

ответ

1

Bash делает встраивать двоичный ноль:

echo -e 'hello\0goodbye' | od -xc 

дает:

0000000  6568 6c6c 006f 6f67 646f 7962 0a65   
     h e l l o \0 g o o d b y e \n 

хотя лично я предпочитаю \x00 обозначения.

Речь идет о программе cut. Таким образом, вы можете использовать язык awk. Например:

awk -F '\0' '{print $1}' testlist 

(примечание: не требуется не cat) и:

foobar='hello\0goodbye' 
echo -e "$foobar" | awk -F '\0' '{print $1}' 

оба дают:

hello 

Однако \0 расширяется в пустую строку (как описано в man bash), поэтому

foobar=$(echo -e 'hello\0goodbye') 

теряет нуль, как вы нашли.

Смежные вопросы