![bash만 사용하여 단일 문자열을 문자 배열로 분할합니다.](https://linux55.com/image/63360/bash%EB%A7%8C%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%8B%A8%EC%9D%BC%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EB%AC%B8%EC%9E%90%20%EB%B0%B0%EC%97%B4%EB%A1%9C%20%EB%B6%84%ED%95%A0%ED%95%A9%EB%8B%88%EB%8B%A4..png)
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}"