"세 단어"라는 파일이 있습니다. 여기에는 다음 정보가 포함됩니다.
\#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
bash
4 명이 있다면
mapfile -t array < <(grep ^# threewords | cut -c2-)
채울 것입니다 array
. 요소당 한 행씩
printf "%s\n" "${array[@]}"
gray speedy bee
gray greedy pea