Когда я устанавливаю IFS
переменную в пробел, bash
обрабатывает несколько пробелов как один пробел ( myprogram
это программа, которая печатает полученные аргументы командной строки):
IFS=" "
x="hello hi world"
./myprogram $x
argv[1] = hello
argv[2] = hi
argv[3] = world
Но когда я устанавливаю IFS
переменную на запятую, bash
несколько запятых не обрабатываются как одна запятая:
IFS=","
x="hello,,,hi,,,world"
./myprogram $x
argv[1] = hello
argv[2] =
argv[3] =
argv[4] = hi
argv[5] =
argv[6] =
argv[7] = world
Это почему?
Ответы:
Это задокументировано в
man bash
. Единственное вхождение любого символа в IFS, который не является пробелом, ограничивает поле.От
man bash
:Примеры: разделение полей
Если IFS не имеет пробельных символов, тогда пробел включается в поля:
Если IFS имеет и пробелы, и запятую, то последовательности пробелов, за которыми следует запятая, а затем последовательности пробелов, рассматриваются как один разделитель:
Последовательности запятых интерпретируются как последовательности пустых полей:
Примеры: пробелы в начале и в конце
Если IFS не содержит пробелов, тогда любые пробелы в начале и конце сохраняются в полях:
Если IFS содержит пробелы, то удаляются все начальные или конечные последовательности пробелов:
источник
awk
с помощью-F'\t'
опции илиcut
. С другой стороны , если у вас есть последняя версияbash
, вы можете быть в состоянии разобрать поля , используяreadarray
с-d$'\t'
опцией.