Вопрос: Как разбить строку на символ в BASH?


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

Вот пример кода auth:

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


6
2017-08-22 17:32


Источник


Обычно вы будете использовать разрез. Почему ограничение на внешние двоичные файлы? - Grant
Это на встроенном Linux-устройстве с ограниченным доступом к ним. - Jay Hellwig


Ответы:


Попробуйте использовать Внутренний разделитель поля (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 петля.


15
2017-08-22 17:35



Если вы не изменили IFS по умолчанию, вы можете игнорировать сохранение значения IFS в частях OIFS и просто unset IFS когда вы закончите. - violet
Не могли бы вы объяснить синтаксис ${AUTH_CODE[@]}? Это [@] что заставляет bash разбивать строку? - Sam Goldberg
Я тестировал это на Linux, кажется, что требуется только установить IFS, и после этого строка уже разделена. т.е.: `OIFS = $ IFS; IFS = '-'; для s в $ AUTH; do echo $ s; done; IFS = $ OIFS` [@] казалось, не требуется вообще? - Sam Goldberg


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

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

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


5
2017-08-22 17:47



это не добавляет читаемости, которую я хочу, хотя, учитывая, что операции над каждым элементом довольно интенсивные - Jay Hellwig
Я не понимаю. Что не читаемо? Вам не нужно делать это в одной строке - вы можете иметь столько строк, сколько хотите do а также done, - Tometzky


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

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

4
2017-08-23 13:50





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

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

2
2017-08-29 14:57





for i in {1..10}; do echo '82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'|cut -d"-" -f$i;done

0
2017-08-23 14:02



Возможно, вы пропустили часть «никаких внешних двоичных файлов». - nickgrim