Bash: разбить строку на массив символов - PullRequest
52 голосов
/ 28 сентября 2011

У меня есть строка в сценарии оболочки Bash, которую я хочу разделить на массив символов, не на основе разделителя, а только один символ на индекс массива. Как я могу это сделать? В идеале он не будет использовать никаких внешних программ. Позвольте мне перефразировать это. Моя цель - переносимость, поэтому такие вещи, как sed, которые могут быть в любой POSIX-совместимой системе, хороши.

Ответы [ 13 ]

0 голосов
/ 11 марта 2018

Для тех, кто приземлился здесь в поисках, как это сделать в fish :

Мы можем использовать встроенную команду string (начиная с v2.3.0) для работы со строками.

↪ string split '' abc
a
b
c

Вывод представляет собой список, поэтому операции с массивами будут работать.

↪ for c in (string split '' abc)
      echo char is $c
  end
char is a
char is b
char is c

Вот более сложный пример итерации по строке с индексом.

↪ set --local chars (string split '' abc)
  for i in (seq (count $chars))
      echo $i: $chars[$i]
  end
1: a
2: b
3: c
0 голосов
/ 12 сентября 2012

AWK довольно удобен:

a='123'; echo $a | awk 'BEGIN{FS="";OFS=" "} {print $1,$2,$3}'

, где FS и OFS - разделитель для считывания и распечатки

0 голосов
/ 28 сентября 2011

Если вы хотите сохранить это в массиве, вы можете сделать это:

string=foo
unset chars
declare -a chars
while read -N 1
do
    chars[${#chars[@]}]="$REPLY"
done <<<"$string"x
unset chars[$((${#chars[@]} - 1))]
unset chars[$((${#chars[@]} - 1))]

echo "Array: ${chars[@]}"
Array: f o o
echo "Array length: ${#chars[@]}"
Array length: 3

Последний x необходим для обработки того факта, что новая строка добавляется после $string, если она не содержит таковую.

Если вы хотите использовать символы, разделенные NUL, вы можете попробовать это:

echo -n "$string" | while read -N 1
do
    printf %s "$REPLY"
    printf '\0'
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...