안녕하세요, ksh 스크립트를 사용하여 한 줄을 배열로 읽으려고 합니다. 그러나 필드 값에 쉼표가 있는 경우 해당 값 중 일부는 인접한 배열 요소에 여러 번 저장됩니다. 이 상황을 피하는 방법은 무엇입니까?
입력하다
17~4~~~char~Y~\"[_a-zA-Z0-9\.]\+@[a-zA-Z0-9]\+\.[a-z]\{2,\}\"~40~email id
암호
while IFS= read -r line
do
if [ $n != 1 ]; then
IFS="~"
set -A star $line
col_pos=${star[1]}
col_patt=${star[6]}
col_len=${star[7]}
col_file_id=${star[0]}
$행 값
17 4 char Y \"[_a-zA-Z0-9\.]\+@[a-zA-Z0-9]\+\.[a-z]\2\" \"[_a-zA-Z0-9\.]\+@[a-zA-Z0-9]\+\.[a-z]\\\" 40 email id
문제는 읽을 때 패턴("[_a-zA-Z0-9.]+@[a-zA-Z0-9]+.[az]\2")이 반복되는데, 실제 입력 파일에서는 패턴 필드는 한 번 정의됩니다.
답변1
존재하다:
set -A star $line
인용되지 않은 것처럼 $line
분할+글로브 연산자를 호출하고 있습니다. 여기서는 분할 섹션이 필요하지만 전역 섹션은 필요하지 않으므로 먼저 비활성화해야 합니다.
set -o noglob
@Isaac이 올바르게 식별한 것처럼 여기서 문제는 globbing과 관련이 없지만 globbing 외에도 ksh(및 ksh1만)에 의해 중괄호 확장이 수행되지만 globbing이 비활성화되면 비활성화됩니다.
set -A array x y z
배열을 전체적으로 설정하는 ksh88/pdksh 방법입니다. ksh의 최신 버전(ksh93 및 mksh 포함)은 zsh 스타일을 채택했습니다 array=(x y z)
.
구문을 사용하려면 set -A
다음이 필요합니다.
set -A array -- values
(zsh에서 ksh를 에뮬레이션하지 않는 경우 제외) 그렇지 않으면 -
첫 번째 값이 또는 로 시작하면 올바르게 작동하지 않습니다 +
.
그래서:
set -o noglob; IFS='~'
while IFS= read -r line
do
if [ "$n" != 1 ]; then
set -A star -- $line
col_pos=${star[1]}
col_patt=${star[6]}
col_len=${star[7]}
col_file_id=${star[0]}
하지만 여기서는 이러한 모든 문제를 피하고 다음 표준 sh
구문을 사용하겠습니다.
while IFS='~' read -r col_file_id col_pos x x x x col_patt col_len x
do
if [ "$n" != 1 ]; then
¹ mksh 및 일부 최신 버전의 ksh93에서 POSIX 모드가 활성화되지 않거나 컴파일 타임에 중괄호 확장이 완전히 비활성화되지 않는 한
답변2
질문:
- 스크립트가 불완전합니다(완료 누락, fi 누락 등).
- 변수는 따옴표로 묶어야 합니다(기본적으로 항상).
그러나 주요 문제는 괄호 표현식 {2,}
앞과 끝, 2
그리고 nothing
확장 시 문자열을 반복하는 중괄호 표현식에 있습니다 set -A star $line
.
하나인용되지 않음 $line
여러 확장이 있을 것이며 그 중 하나는 중괄호 확장입니다 {,}
.
따옴표 없이 문자열을 확장하지 않고 분할하려면 ~
구분 기호로 사용하고 값을 배열에 넣으면 다음과 같이 작동할 수 있습니다.
while IFS= read -r onestar; do star+=("$onestar"); done <<<"${line//~/$'\n'}"
line
줄 바꿈 없이 단 한 줄만 있다고 가정 하면 그래야 하지 않습니까?