2015-04-27 4 views
3

Учитывая этот файлчтение NUL разделителей полого

printf 'alpha\0bravo\0charlie' > delta.txt 

Я хотел бы, чтобы прочитать поля в отдельные переменные. Причина, по которой я использую нулевой разделитель , состоит в том, что поля будут содержать пути к файлам, которые могут содержать любой символ, кроме null. Я попытался следующие команды:

IFS= read mike november oscar < delta.txt 
IFS=$'\0' read mike november oscar < delta.txt 

Однако эти поля не правильно разделить

$ echo $mike 
alphabravocharlie 
+0

Я не считаю, что путь к файлу содержит любой символ, кроме нулевой. – Marichyasana

ответ

1

В качестве обходного пути, я создал эту функцию

function read_loop { 
    while [ "$#" -gt 0 ] 
    do 
    read -d '' "$1" 
    shift 
    done 
} 

Пример использования

read-nul mike november oscar < delta.txt 
2

IFS=$'\0' Назначение не делает нулевой символ разделитель, так как Bash variables cannot hold null characters. IFS=$'\0' эквивалентно IFS=, которые вы можете проверить, выполнив:

bash-4.3$ IFS=$'\0' 
bash-4.3$ echo ${#IFS} 
0 

И IFS= по определению означает, что нет слов расщепления вообще (см Bash Reference Manual).

Что вы можете сделать, это прочитать ненулевые элементы по одному с использованием опции -dread builtin. Согласно связанной документации,

-d delim

Первый символ delim используется для завершения ввода строки, а не символом новой строки.

Для получения желаемого поведения мы можем использовать пустую строку для delim.

Пример (я взял на себя смелость добавить пробела в ваш пример, чтобы продемонстрировать, как она добивается того, чего хочет - не расщепление на пробельном):

bash-4.3$ printf 'alpha with whitespace\0bravo with whitespace\0charlie with whitespace' > delta.txt 
bash-4.3$ { read -r -d '' mike; IFS= read -r -d '' november; IFS= read -r -d '' oscar; echo $mike; echo $november; echo $oscar; } < delta.txt 
alpha with whitespace 
bravo with whitespace 
charlie with whitespace 

Я также использую опцию -r сохранить слеш входной файл. Конечно, вы можете заменить < delta.txt на cat delta.txt | в начале.

Я знаю, что чтение один за другим раздражает, но я не могу придумать ничего лучшего.

+0

Это распространяется (среди многих других) на http://mywiki.wooledge.org/BashFAQ/001. –

+0

@EtanReisner Да, спасибо за другую ссылку. – 4ae1e1

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