다음과 같은 문자열이 있습니다.
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../g
sed
\([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
). 공백이 포함된 경우에만 값 주위에 따옴표를 추가하면 이를 더 스마트하게 만들 수 있지만 여기서는 그렇게 하지 않았습니다.