Bash는 문자열을 문자열 배열로 변환합니까?

Bash는 문자열을 문자열 배열로 변환합니까?

다음과 같은 문자열이 있습니다.

8080 "ac ac df asd" 9019 "f v adfs" 1 "123 da 123x"

Bash를 사용하여 이것을 이와 같은 배열로 변환하는 영리한 방법이 있습니까?

8080 "ac ac df asd"
9019 "f v adfs"
1 "123 da 123x"

답변1

# define function
foo() { while [ -n "$2" ]; do array+=( "\"$1\" \"$2\"" ); shift 2; done; }

# call function with string
foo 8080 "ac ac df asd" 9019 "f v adfs" 1 "123 da 123x"

# print array
printf "%s\n" "${array[@]}"

산출:

"8080" "ac ac df asd"
"9019" "fv adfs"
"1" "123 다 123x"

답변2

나는 그것이 작동한다고 가정하면 이것이 당신이 원하는 것이라고 생각합니다 sed.

$ echo '8080 "ac ac df asd" 9019 "f v adfs" 1 "123 da 123x"' | sed 's/" \([0-9]\)/"\n\1/g'
8080 "ac ac df asd"
9019 "f v adfs"
1 "123 da 123x"

찾고 있는 방법은 패턴을 인식하고 이를 개행 문자로 바꾸는 것입니다 \n. 우리가 인식한 패턴은 sed따옴표, 공백, 숫자 순이었습니다.

" ...digit...

이 경우 + 뒤에 공백을 \n추가하고 싶습니다 . "이제 줄 끝에 공백이 나타나므로 제거할 수 있습니다 "\n\1.노트:\1이것은 in의 일치하는 쪽에서 이 작업을 수행할 때 숫자를 저장하는 변수입니다 . 이스케이프된 대괄호로 문자열을 감싸면 저장할 수 있습니다.s/..match../..replace../gsed\([0-9]\)sed\(..save this..\)

답변3

이렇게 하면 값이 별도의 배열 항목으로 분할되어 연결할 수 있습니다. 더 좋은 방법이 있을 것이라고 확신하지만 이 방법은 귀하가 제공한 입력을 기반으로 요청한 출력을 제공할 것입니다. 이것이 사용자 입력인 경우(또는 제어할 수 없는 입력인 경우) eval.

s='8080 "ac ac df asd" 9019 "f v adfs" 1 "123 da 123x"'
eval t=("$s")                                   # Incautious array assignment

a=()
for k in $(seq 0 $(( (${#t[@]}+1) /2 -1 )) )    # Count pairs of elements
do
    p1=$((k*2)) p2=$((k*2 +1))                  # Indexes into original list
    a+=("${t[$p1]} \"${t[$p2]}\"")              # New element is a pair of originals
done

for p in "${a[@]}"                              # Report elements of array a[]
do
    echo "item> $p" >&2
done

이 코드는 각 쌍의 두 번째 부분에 따옴표가 필요하다고 가정합니다(마침표 동안에는 제거됨 eval). 공백이 포함된 경우에만 값 주위에 따옴표를 추가하면 이를 더 스마트하게 만들 수 있지만 여기서는 그렇게 하지 않았습니다.

관련 정보