텍스트 파일의 각 개별 전체 줄을 배열에 저장하는 방법은 무엇입니까?

텍스트 파일의 각 개별 전체 줄을 배열에 저장하는 방법은 무엇입니까?

"세 단어"라는 파일이 있습니다. 여기에는 다음 정보가 포함됩니다.

\#gray speedy bee

gr-A | sp-E-d-E | b-E

\#gray greedy pea

gr-A | gr-E-d-E | p-E

명령을 실행할 때:

cat threewords | grep ^# | cut -c2-

이 명령은 #으로 시작하는 두 줄을 가져옵니다. 그런 다음 #을 제거하고 이를 출력으로 반환합니다.

gray speedy bee

gray greedy pea

명령을 실행할 때:

array=($(cat threewords | grep ^# | cut -c2-))

배열을 생성하지만 다음과 같이 모든 단어를 별도의 배열 위치로 분리합니다.

array[0] = gray,
array[1] = speedy,
array[2] = bee,
array[3] = gray,
array[4] = greedy,
array[5] = pea

각 줄의 출력을 다음과 같은 배열에 넣도록 코드를 알아낼 수 있습니다.

array[0] = gray speedy bee, 
array[1] = gray greedy pea

답변1

분할은 IFS구분 기호(기본적으로 공백, 줄 바꿈 및 탭 포함)를 사용하여 수행됩니다. 줄 바꿈 전용 으로 설정 IFS:

$ IFS=$'\n' a=($(printf "1 2\n2 3\n"))
$ echo ${a[0]}
1 2
$ echo ${a[1]}
2 3

이는 IFS셸에 따라 변경되므로 먼저 저장하고 복원하는 것이 가장 좋습니다.

OLD_IFS="$IFS"
IFS=$'\n' array=($(grep '^#' threewords | cut -c2-))
IFS="$OLD_IFS"

이렇게 할 이유가 전혀 없습니다.

cat threewords | grep '^#'

grep파일을 완전히 읽을 수 있음:

grep '^#' threewords

~처럼스티븐명령 출력의 추가 쉘 확장을 수행할 때 다음을 사용하여 와일드카드를 비활성화해야 합니다 set -f.

$ help set 
...
      -f  Disable file name generation (globbing).

그렇지 않으면:

$ cd /; a=( $(printf "*\n") )
$ echo ${a[@]}
bin boot cdrom dev etc home ...

답변2

bash4 명이 있다면

mapfile -t array < <(grep ^# threewords | cut -c2-)

채울 것입니다 array. 요소당 한 행씩

printf "%s\n" "${array[@]}"
gray speedy bee
gray greedy pea

관련 정보