Как разделить строку на символ в BASH?

Я хотел бы иметь возможность разделить код авторизации по - характер, так что я могу работать на каждом сегменте в отдельности. Я не хочу использовать внешние двоичные файлы (awk, grep) - это должно быть как можно более минималистично. Какими способами я могу достичь этого?

Вот пример кода авторизации:

82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb

5 ответов

Решение

Попробуйте использовать внутренний разделитель полей (IFS):

AUTH_CODE='82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'

OIFS=$IFS                   # store old IFS in buffer
IFS='-'                     # set IFS to '-'

for i in ${AUTH_CODE[@]}    # traverse through elements
do
  echo $i
done

IFS=$OIFS                   # reset IFS to default (whitespace)

Выход:

82a8
bd7d
986d
9dc9
41f5
fc02
2c20
3175
097a
c1eb

Установив внутренний разделитель полей, вы разделяете AUTH_CODE на - персонаж, позволяя вам перемещаться по вновь созданным элементам в foreach петля.

Вы можете использовать IFS, но это проще:

echo "82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb"- \
  | while read -d - i; do echo "$i"; done

Пожалуйста, обратите внимание на добавленное - после строки для разделения - read игнорирует последний токен в противном случае.

Другой способ сопоставления с образцом и массивом:

AUTH_CODE='82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'
array=( ${AUTH_CODE//-/ } )
for j in ${array[@]} ; do echo $j ; done

Просто используйте расширение параметров:

AUTH_CODE='82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'
echo "${AUTH_CODE//-/$'\n'}"

Выход:

82a8
bd7d
986d
9dc9
41f5
fc02
2c20
3175
097a
c1eb
for i in {1..10}; do echo '82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'|cut -d"-" -f$i;done
Другие вопросы по тегам