Как назначить строку из нескольких слов в массив - PullRequest
0 голосов
/ 09 января 2020

У меня есть переменная со следующим содержимым.

message="It's wings are too small to get its fat little body off the ground"

Как разделить его на:

arr[0] = "It's wings"
arr[1] = "are too"
arr[2] = "small to"
arr[3] = "get its"
arr[4] = "fat little"
arr[5] = "body off"
arr[6] = "the ground"

Ответы [ 3 ]

3 голосов
/ 09 января 2020

Если вы хотите прочитать входные данные два по два и сохранить их в массиве, как насчет:

message="It's wings are too small to get its fat little body off the ground"

while read -r w1 w2 message <<< "$message"; do
    arr+=("$w1 $w2")
    [[ -z $message ]] && break
done

for (( i=0; i<${#arr[@]}; i++ )); do
    printf "arr[%d] = \"%s\"\n" "$i" "${arr[i]}"
done

Вывод:

arr[0] = "It's wings"
arr[1] = "are too"
arr[2] = "small to"
arr[3] = "get its"
arr[4] = "fat little"
arr[5] = "body off"
arr[6] = "the ground"
1 голос
/ 09 января 2020

Или используя массивы

a1=( $message )
while  [[ "${a1[@]}" ]]; do
    a2+=( "${a1[0]}     ${a1[1]}" )
    unset    a1[0]; unset a1[1]
    a1=(  "${a1[@]}" )
done
1 голос
/ 09 января 2020

Используя Bash RegEx:

#!/usr/bin/env bash

declare -a arr=()
message="It's wings are too small to get its fat little body off the ground"

while [[ "$message" =~ ([^[:space:]]+[[:space:]]+[^[:space:]]+)(.*) ]]; do
  arr+=("${BASH_REMATCH[1]}")
  message="${BASH_REMATCH[2]}"
done

for i in "${!arr[@]}"; do
  printf 'arr[%d] = "%s"\n' "$i" "${arr[i]}"
done

Или используя аргументы:

#!/usr/bin/env bash

declare -a arr=()
message="It's wings are too small to get its fat little body off the ground"

set -- $message
while (($#)); do
  arr+=("$1 $2")
  shift 2
done

for i in "${!arr[@]}"; do
  printf 'arr[%d] = "%s"\n' "$i" "${arr[i]}"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...