bash만 사용하여 단일 문자열을 문자 배열로 분할합니다.

bash만 사용하여 단일 문자열을 문자 배열로 분할합니다.

bash 만 사용하여 배열 'hello'로 분할하고 싶습니다 h e l l o. sed에서 할 수 있지만 sed 's/./& /g'구분 기호가 무엇인지 또는 구분 기호가 무엇인지 모르는 경우 Bash에서 문자열을 배열로 분할하는 방법을 알고 싶습니다. 단일 문자. ${i// /}구분 기호를 알 수 없고 해당 표현식이 정규 표현식을 허용하지 않기 때문에 창의성 없이는 사용할 수 없을 것 같습니다 . [[ string =~ ([az].).* ]]와 함께 BASH_REMATCH를 사용해 보았지만 예상대로 작동하지 않았습니다. bash 만 사용하여 string.split()특정 동작을 수행하는 올바른 방법은 무엇입니까 ? 그 이유는 모든 bash에서 rev 유틸리티를 작성하려고 하기 때문입니다.

  while read data; do
  word=($(echo $data|tr ' ' '_'|sed 's/./& /g'))
  new=()
  i=$((${#word[@]} - 1))
  while [[ $i -ge 0 ]]; do
    new+=(${word[$i]})
    (( i-- ))
  done
  echo ${new[@]}|tr -d ' '|tr '_' ' '
  done

하지만 저는 tr과 sed를 사용하고 있으며 분할을 올바르게 수행하는 방법을 알고 싶습니다. 그런 다음 모든 bash에서 수정합니다. 재미로.

답변1

s="hello"
declare -a a   # define array a
for ((i=0; i<${#s}; i++)); do a[$i]="${s:$i:1}"; done
declare -p a   # print array a in a reusable form

산출:

명령문-aa='([0]="h" [1]="e" [2]="l" [3]="l" [4]="o")'

또는 (댓글을 참고해주세요)

s="hello"
while read -n 1 c; do a+=($c); done  <<< "$s"
declare -p a

산출:

명령문-aa='([0]="h" [1]="e" [2]="l" [3]="l" [4]="o")'

답변2

null 구분 기호를 사용하여 문자열을 문자 배열로 분할하려면 다음을 수행할 수 있습니다.

str='hello'
arr=()
i=0
while [ "$i" -lt "${#str}" ]; do
  arr+=("${str:$i:1}")
  i=$((i+1))
done

printf '%s\n' "${arr[@]}"

비어 있지 않은 구분 기호를 사용하면 다음을 수행할 수 있습니다.

set -f
str='1,2,3,4,5'
IFS=',' arr=($str)
printf '%s\n' "${arr[@]}"

답변3

재미를 위한(그리고 다른 쉘) 다른 변형:

word=hello
unset letter
while [ ${#word} -gt 0 ]
do
    rest=${word#?}
    letter[${#letter[*]}]=${word%$rest}
    word=$rest
done

그리고 확인

for l in "${!letter[@]}"
do
    echo "letter [$l] = ${letter[l]}"
done

인쇄할 것이다

letter [0] = h
letter [1] = e
letter [2] = l
letter [3] = l
letter [4] = o

답변4

대답은 다음과 같습니다.https://stackoverflow.com/a/34634535/2332068

  [[ "${text}" =~ ${text//?/(.)} ]] && array=("${BASH_REMATCH[@]:1}")

Bash 4.3에서 ${data@Q}의 대안을 사용하고 있습니다.

shell-escape-to() {
  local REPLY="${*:2}"
  [[ "${*:2}" =~ ${REPLY//?/(.)} ]] && printf -v "$1" "\\%c" "${BASH_REMATCH[@]:1}"
}
...
shell-escape-to dir_ "$dir"
sg "$GROUP" "exec mkdir -m 775 -p ${dir_}"

bash 4.4 이상: sg "$GROUP" "exec mkdir -m 775 -p ${dir@Q}"

관련 정보