Давайте попробуем это еще раз ... предполагая, что в ваших данных нет запятых, вы можете использовать вариант команды read
, чтобы разбить строку на список переменных.
Чтобы показать, что это решение обрабатываетвстроенный пробел, мы начнем с измененной версии вашей примерной строки:
$ input="1,2018-05-16,abc def,asdf 123"
Теперь мы скажем read
использовать запятую в качестве разделителя полей ввода (IFS), и мы будемиспользуйте здесь-строку для передачи ${input}
в read
, что дает нам:
$ IFS=, read -r VAR1 VAR2 VAR3 VAR4 <<< "${input}"
$ echo "${VAR1}"
1
$ echo "${VAR2}"
2018-05-16
$ echo "${VAR3}"
abc def
$ echo "${VAR4}"
asdf 123
Это должно быть немного быстрее, чем мой предыдущий ответ (ниже), основанный на подстановке параметров * плюс *, который вы используетеНе уничтожайте содержимое ${input}
.
Вот bash fiddle для вышеуказанного решения и ksh93 fiddle , показывающее то же решение.
Мой предыдущий ответ / разговоры ...
Если вы можете работать с массивами, запустите поиск по "bash split string to array", и вы должны получить несколько SO хитов, чтобы выручить вас.
Если вам абсолютно необходимо положительно использовать индивидуальныерибалам, я бы, вероятно, использовал подстановку параметров для удаления полей.
${variable%%,*} # strip off the first field of a comma-delimited string
${variable#*,} # strip off fields 2-n of a comma-delimeted string
Применяя это к вашему примеру строки, мы получаем:
$ input="1,2018-05-16,abc,123"
$ VAR1="${input%%,*}" input="${input#*,}"
$ VAR2="${input%%,*}" input="${input#*,}"
$ VAR3="${input%%,*}" input="${input#*,}"
$ VAR4="${input%%,*}" input="${input#*,}"
$ echo "${VAR1}"
1
$ echo "${VAR2}"
2018-05-16
$ echo "${VAR3}"
abc
$ echo "${VAR4}"
123
- каждый последующий
VAR= / input=
пара помещает ведущее поле в VAR
и обновляет input
, чтобы содержать оставшиеся поля - , если вам нужно сохранить исходное значение в
input
, затем начните с копирования input
в другую переменную, которую выможет разбиться на части
Хотя это может показаться немного большим количеством программирования, чем, скажем, использование cut
или awk
для удаления полей, ключевое преимущество в том, что вам не нужно порождатьновый подпроцесс (как вы делаете для решений cut
и awk
), поэтому вы должны обнаружить, что производительность улучшается (и повышение производительности должно быть весьма заметно при больших объемах обработки входной строки).
Очевидно (?) Это может немного усложниться, если вы имеете дело с данными, которые а) содержат запятые, б) охватывают несколько строк и / или в) содержат непечатный / контрольный символRS ...