Bash: 여러 줄 입력을 배열로 분할

Bash: 여러 줄 입력을 배열로 분할

여러 줄의 문자열과 쉼표로 구분된 base64 인코딩 데이터가 포함된 파일이 있습니다.

예:

1,meV9ivU4PqEKNpo5Q2u2U0h9owUn4Y8CF83TTjUNWTRQs7dEgVxnsMgf4lvg9kvxcIaM3yB4Ssim
z46M/C7YlovNUmrjOByhV1SCb/bGyv1yL7SYFnw1GHbYjdH0b6UZ7nQzJHU6VmwMo0V77vFNy6nx
rmJZ4KqW9EcjdV1plQmsVXSiZVi61+fNOHCMDmVtJ4q097geWxf4bT0/k/yRyRwi5Zr8BC64htVS
AdwOSo4PIk7xDLOzLywAYOCDQvD/zuErf1L0e8nHGz2LKdApHdEWB7Y2yM3iZyXuQ4sMx0+oX66+
FxwUulvHj+EpXtLJx5rmV7AUjr/GsNw/1aYAGPCfz0S+//Ic5pXX5rY1fZ96oFGw4a9vRiAmxe/w
ZOza6LtwuF+WUHjbIeWTUKKQGgFIM81dwVHHY7xdRnQhK5J0Zf3Xz0GzzZj5/2YFbI8q7lVkJ3ZQ
7Oqt0qdfk3aj+BQhOxmn1F55yACPBZoPUw6K8ExTHHGVGdCEiIDTu5qKHcUwK0hGAZA9Mun5KTO0
gPs9JxF8FJjkQBF7rEa6TP3pH5OwdkATH2uf+Zcmp1t6NbBymXVlsLzWZookVsaT1DNXf1I1H8Xz
8dnfh6Yl63jSr2PAhDrcOqJNM8Z9/XhBGxtlD1ela3nq6N1ErR1Gv1YZKNeNcL7O2Z3Vl2oyyDw=,U2FsdGVkX1/c8rTTO41zVT7gB+KL+n7KoNCgM3vfchOyuvBngdXDGjXTvXTK0jz6

이제 각 여러 줄 문자열이 배열 요소가 되도록 내용을 배열로 분할하고 싶습니다.

IFS를 사용해 보았으나 첫 번째 줄만 읽혔습니다.

filecontent=$(cat myfile)
IFS=',' read -a myarray <<< "$filecontent"

결과:

$myarray[0] = 1 
$myarray[1] = meV9ivU4PqEKNpo5Q2u2U0h9owUn4Y8CF83TTjUNWTRQs7dEgVxnsMgf4lvg9kvxcIaM3yB4Ssim

예상되는:

$myarray[0] = 1
$myarray[1] = meV9ivU4PqEKNpo5Q2u2U0h9owUn4Y8CF83TTjUNWTRQs7dEgVxnsMgf4lvg9kvxcIaM3yB4Ssim
z46M/C7YlovNUmrjOByhV1SCb/bGyv1yL7SYFnw1GHbYjdH0b6UZ7nQzJHU6VmwMo0V77vFNy6nx
rmJZ4KqW9EcjdV1plQmsVXSiZVi61+fNOHCMDmVtJ4q097geWxf4bT0/k/yRyRwi5Zr8BC64htVS
AdwOSo4PIk7xDLOzLywAYOCDQvD/zuErf1L0e8nHGz2LKdApHdEWB7Y2yM3iZyXuQ4sMx0+oX66+
FxwUulvHj+EpXtLJx5rmV7AUjr/GsNw/1aYAGPCfz0S+//Ic5pXX5rY1fZ96oFGw4a9vRiAmxe/w
ZOza6LtwuF+WUHjbIeWTUKKQGgFIM81dwVHHY7xdRnQhK5J0Zf3Xz0GzzZj5/2YFbI8q7lVkJ3ZQ
7Oqt0qdfk3aj+BQhOxmn1F55yACPBZoPUw6K8ExTHHGVGdCEiIDTu5qKHcUwK0hGAZA9Mun5KTO0
gPs9JxF8FJjkQBF7rEa6TP3pH5OwdkATH2uf+Zcmp1t6NbBymXVlsLzWZookVsaT1DNXf1I1H8Xz
8dnfh6Yl63jSr2PAhDrcOqJNM8Z9/XhBGxtlD1ela3nq6N1ErR1Gv1YZKNeNcL7O2Z3Vl2oyyDw=
$myarray[2] = U2FsdGVkX1/c8rTTO41zVT7gB+KL+n7KoNCgM3vfchOyuvBngdXDGjXTvXTK0jz6

누구든지 나를 도와줄 수 있나요?

답변1

귀하의 시도는 실제 솔루션에 가깝습니다. 관련 플래그는 read도움말에서 찾을 수 있습니다.

$ help read
...
      -d delim  continue until the first character of DELIM is read, rather
            than newline

명시적으로 언급하지는 않지만 구분 기호를 비워 두어 EOF로 읽을 수 있도록 설정할 수 있습니다.

$ IFS=, read -d '' -a myarray < myfile

$ echo ${myarray[2]}
U2FsdGVkX1/c8rTTO41zVT7gB+KL+n7KoNCgM3vfchOyuvBngdXDGjXTvXTK0jz6

답변2

IFS줄 바꿈을 시도해 보셨나요?IFS=$'\n' read -a myarray <<< "$filecontent"

내가 이것을 제안하는 이유 $'\n'는 bash가 문자열 리터럴의 이스케이프 시퀀스를 해석하지 않기 때문입니다.

답변3

예상한 결과에서 $myarray[2]의 첫 번째 인스턴스는 $myarray[1]이어야 한다고 가정합니다.

파일 내용을 쉘 변수에 할당하기 전에 포함된 줄바꿈을 제거하여 원하는 결과를 얻을 수 있습니다.

filecontent=$(tr -d \\n <myfile)

답변4

-d ''한 줄만 읽는 대신 전체 파일을 읽는 데 사용됩니다 .

 -d delim   continue until the first character of DELIM is read, rather
            than newline
$ cat file.txt 
abcd
efgh
$ IFS=$'\n' read -a ARR < file.txt
$ echo ${#ARR[@]}
1 # only 1 element
$ IFS=$'\n' read -a ARR -d '' < file.txt
$ echo ${#ARR[@]}
2 # whole file

또 다른 사항: 사용하는 경우
(끝 부분에서) 언급한 대로 스크립트에 해당 항목이 없는지 확인하세요.set -e-d ''read --help

 Exit Status:   
    The return code is zero, **unless end-of-file is encountered**...
$ IFS=$'\n' read -a ARR < file.txt
$ echo $?
0
$ IFS=$'\n' read -a ARR -d '' < file.txt
$ echo $?
1 # Your script will exit if you `set -e`

관련 정보