Как разделить вывод и сохранить его в массиве?

Другая опция состояла бы в том, чтобы использовать fetchmail, чтобы вытянуть почту от Gmail и поместить его в локальный mbox файл.

9
29.02.2012, 08:35
3 ответа

Можно использовать что-то вроде этого для одной строки входа:

IFS="," read -ra arr <<< "$foo"

Демонстрация:

$ cat t.sh 
foo="3,aac-lc, 93.8, aaclc, 77.3, h.264, 1024.6, ..." # snipped

IFS="," read -ra arr <<< "$foo"
echo ${#arr[@]}
echo ${arr[0]}
echo ${arr[30]}
$ ./t.sh 
31
3
1280 720

Кредиты: строка Разделения на основе разделителя в ударе? ответ Johannes Schaub. Проверьте другие ответы там также.

9
27.01.2020, 20:06

Ваш первый отрывок - ничто как синтаксис оболочки. Это - корректный синтаксис Perl.
Ваш второй отрывок не использует cut правильно; я не знаю то, что Вы предназначили.

Оболочка имеет встроенную строковую конструкцию разделения: когда Вы пишете $somevar без любых кавычек оболочка сначала ищет значение переменной somevar, затем разделения, которые оценивают в отдельные слова символами, указанными IFS, и наконец интерпретирует каждое слово как шаблон шарика (подстановочный знак файла). Таким образом, можно разделить строку путем установки IFS к символу разделителя и временно выключающий globbing.

set -f; IFS=,
arr=($stats)
set +f; unset IFS

Обратите внимание, что, если поле содержит пробел, элемент массива сохранит тот пробел. Если Вы хотите разделить во всем пробеле, а также запятых, установить IFS=', '. Отметьте это IFS строка не должна разделять в, но ряд символов для разделения в; или пространство или запятая составят разделитель. Кроме того, существуют специальные правила для пробела: любая последовательность нуля или большего количества пробелов, сопровождаемых запятой, сопровождаемой нулем или большим количеством пробелов, составит один разделитель, и любая последовательность одних или нескольких пробелов также составит разделитель.

Если Вы только хотите разделить пробел вначале или конец поля, необходимо будет сделать это поэлементно.

shopt -s extglob
for ((i=0; i<${#arr[@]}; i++)); do
  arr[i]=${arr[i]#+( )}   # strip one or more spaces at the beginning
  arr[i]=${arr[i]%+( )}   # strip one or more spaces at the end
done
2
27.01.2020, 20:06
$ set -f  # turn off globbing, so as not to expand wildcards
$ arr=($(echo "$stats" | sed 's/,/ /g'))
$ echo ${arr[1]}
aac-lc
2
27.01.2020, 20:06
  • 1
    Обратите внимание, что это будет рассматривать пробел как разделители, а также запятые. –  Gilles 'SO- stop being evil' 29.02.2012, 22:14

Теги

Похожие вопросы