다음 변수의 데이터를 동적 배열로 처리하는 데 문제가 있습니다.
variable_1='A|B|C|D' -> dynamic_array=(A B C D)
sed 명령을 사용하여 '|'를 공백으로 바꾸고 데이터를 Dynamic_array에 전달하는 방법을 시도했습니다.
한 줄의 코드로 이를 수행할 수 있는 방법이 있습니까?
답변1
변경할 필요가 없습니다 IFS
.배쉬 4.4부터 시작:
readarray -td '|' arr < <(printf '%s' "$var")
$ var='A|B|C|D'
$ readarray -td '|' arr < <(printf '%s' "$var")
$ echo "${arr[0]}"; echo "${arr[3]}"
A
D
바라보다help readarray
설명하다.
참고: 이전 제안( readarray -td '|' arr <<< "$var"
)은 더 짧지만 Freddy가 지적한 것처럼 마지막 배열 요소에 가짜 개행 문자를 삽입합니다.
답변2
가정 bash
:
단어 분사를 활용할 수 있습니다. 내부 필드 구분 기호(IFS)의 기본값은 공백, 탭 또는 줄 바꿈입니다. 그러나 환경 변수를 설정하여 이를 재정의할 수 IFS
있으며 그런 다음 일반적인 방법을 사용하여 변수를 만들 수 있습니다.
set -f # disable filename expansion
IFS='|' arr=($variable_1)
또는 declare
:
IFS='|' declare -a 'arr=($variable_1)'
또는 read
:
IFS='|' read -ra arr <<< "$variable_1"
이와 같은 변수를 변경하는 경우 IFS
먼저 다른 변수에 저장한 후 재설정해야 할 수도 있습니다.
OLD_IFS="$IFS"
# my commands
IFS="$OLD_IFS"
답변3
가정적으로 요소에 포함된 모든 문자 또는 비문자에 적용되는 매개변수 확장 플래그를 zsh
사용할 수 있습니다 .s
$ string=$'first element|second\nbinary\x80element\0||second-last|'
$ array=("${(@s[|])string}")
$ typeset -p string array
typeset string=$'first element|second\nbinary\M-\C-@element\C-@||second-last|'
typeset -a array=( 'first element' $'second\nbinary\M-\C-@element\C-@' '' second-last '' )
빈 문자열은 빈 요소( string=''
gets array=( '' )
, not array=( )
)로 분할됩니다.