변수 대체를 사용하여 구분된 문자열 분할

변수 대체를 사용하여 구분된 문자열 분할

"#"으로 구분된 줄이 있고 3개의 필드가 포함된 샘플 파일이 있습니다.

A#B#C
D#E#F

다음 대신 UNIX 변수 대체를 사용하여 행의 각 필드 값을 가져올 수 있습니까?

cat file | while read a; do
    f1=`echo $a | cut -d# -f1`
    f2=`echo $a | cut -d# -f2`
    f3=`echo $a | cut -d# -f3`
 done

답변1

이것이 의미하는 바라면 매개변수 확장을 사용할 수 있습니다. 하지만 읽기가 쉽지 않습니다.

while read a; do
  # comments are for the first line A#B#C
  f1f2=${a%#*}  # remove suffix #C -> A#B
  f1=${f1f2%#*} # remove suffix #B -> A
  f2=${f1f2#*#} # remove prefix A# -> B
  f3=${a##*#}   # remove longest prefix: A#B# -> C
  echo "$f1,$f2,$f3" # do something with f1,f2,f3
done < file

IFS=#내부 필드 구분 변수를 설정하고 각 행을 세 개의 변수로 분할하는 것이 더 쉽습니다.

while IFS=# read f1 f2 f3; do
  echo "$f1,$f2,$f3" # do something with f1,f2,f3
done < file

답변2

ksh에서는 배열을 사용할 수도 있습니다.

while IFS='#' read -A arr; do
    echo "${#arr[@]} items, second item: ${arr[1]}"
done < file

read -AZsh에서도 작동하지만 배열 인덱싱은 1 기반입니다. Bash는 read -aksh와 유사하게 작동합니다.

관련 정보