다음 내용이 포함된 파일이 있습니다.
FILETYPE=A:B:C:D
Linux에서 ksh 스크립트의 배열로 grep
검색 A
하고 B
저장하는 C
방법 은 무엇입니까? D
나는 노력했다
FILETYPES=`grep "FILETYPE" ${CONF_FILE} | awk -F: '{print $NF}'`
그러나 이것은 마지막 것만 얻습니다.
답변1
GNU/Linux에서는 ksh93 또는 mksh(또는 zsh
ksh 에뮬레이션 모드)를 사용하여 다음을 수행할 수 있습니다.
set -o noglob
filetypes=( $(grep -Po 'FILETYPE=\K.*' < "$CONF_FILE" | tr ':' ' ') )
(기본값으로 가정 $IFS
)
또는 좀 더 관용적으로 말하면:
set -o noglob
IFS=:
filetypes=( $(grep -Po 'FILETYPE=\K.*' < "$CONF_FILE"))
배열 이름에는 소문자를 사용하고 있는데, 이는 환경 변수가 일반적으로 대문자이기 때문에 일반적으로 더 안전합니다. 명령의 출력을 배열로 저장하는 방법은 다음과 같습니다.
array=( $(command) )
glob을 비활성화하고 필드 구분 기호를 설정한 후.
그런 다음 명령 자체 grep
(여기서는 GNU grep
또는 Perl 호환 정규식 지원이 활성화된 것으로 가정( )). 이것이 의미하는 바를 -P
알려줍니다.\K
"지금까지 일치하는 항목을 모두 삭제합니다.". 줄의 일치하는 부분만 인쇄되도록 하고, 와 함께 사용하면 해당 -o
부분만 인쇄됩니다. 마지막으로 기본값에 있는 공백으로 바꿉니다.grep
\K
A:B:C:D
tr
:
$IFS
$ printf '%s\n' "${filetypes[0]}"
A
$ printf '%s\n' "${filetypes[3]}"
D
답변2
짧은 답변:
array=( `grep -Po '(?<=FILETYPE=).*$' $CONFIG_FILE | tr ':' ' '` )
설명: grep은 "FILETYPE=" 뒤에 있는 모든 항목을 반환하기 위해 "look Behind" 어설션을 사용합니다.
결국 배열은 다음과 같이 선언됩니다.
array=(A B C D)
그런 다음 테스트하십시오.
echo "${array[0]} ${array[1]} ${array[2]} ${array[3]}"
인쇄:
A B C D
답변3
또는 :ksh93
mksh
{ read -rd=; IFS=: read -rA filetypes; } <file
위 명령은 먼저 입력의 첫 번째 문자를 {...;}
읽고 포함합니다 . =
입력의 이 부분은 REPLY
변수에 저장되며 나중에 어떤 목적으로도 사용되지 않습니다. 그런 다음 코드는 거기에서 이동하여 :
-로 구분된 문자열을 배열로 읽습니다 filetypes
.
-d
in 옵션을 사용하면 명령이 주어진 문자(개행 문자 대신)를 읽습니다 read
. 이 명령에 대한 ksh
옵션을 사용하면 -A
문자열 변수 대신 인덱스 배열을 읽을 수 있습니다. 를 사용하면 -A
변수 값이 IFS
입력의 배열 요소를 분할하는 데 사용됩니다.
시험:
$ cat file
FILETYPE=A:B:C:D
$ { read -rd=; IFS=: read -rA filetypes; } <file
$ printf '"%s"\n' "${filetypes[@]}"
"A"
"B"
"C"
"D"
-A
로 변경하면 -a
코드가 bash
.
파일에 읽고 싶지 않은 추가 줄이 포함되어 있으면 ksh93
다음을 사용하십시오 .
grep '^FILETYPE=' file | { read -rd=; IFS=: read -rA filetypes; }
쉘 옵션이 설정되어 있고 코드가 작업 제어가 비활성화된(그리고 위에 설명된 대로 변경된) 비대화형 쉘(예: 스크립트)에서 실행되지 않는 한 mksh
Nor에서는 작동하지 않습니다 .bash
lastpipe
-A
-a