IFS 분할 문제

IFS 분할 문제

Bash 쉘 스크립트 시작 부분에 다음 줄을 사용합니다.

IFS=':#:'

그러나 필드를 구분하기 위해 :#:을 사용하지 않고 콜론만 사용합니다. 질문이 있으신가요?

편집하다:

이것은 텍스트 파일의 내 데이터입니다.

f:#:0
c:#:Test C
s:#:test S
ctype:#:0
a:#:test A
t:#:10:02:03
r:#:test r

f:#:0
c:#:Test C1
s:#:test S1
ctype:#:1
a:#:test A1
t:#:00:02:22
r:#:test r

f:#:20
c:#:Test C
s:#:test S
ctype:#:2
a:#:test A1
t:#:00:02:03
r:#:test r

...다음 코드를 사용하여 읽습니다.

IFS=':#:'   
while read -r key value; do
 .....
done < "$FileName" 

답변1

@heemayl이 지적했듯이 문제는 IFS가 전체 문자열을 구분 기호로 처리하지 않고 각 문자를 별도의 구분 기호로 처리한다는 것입니다. awk그러나 문자열을 구분 기호로 사용할 수 있습니다.

예를 들어:

#!/bin/bash
while read -r key value
do 
   printf 'key %-7s val %s\n' "$key" "$value" 
done < <(awk -F ':#:' '{print $1" "$2}' $FileName )

key f       val 0
key c       val Test C
key s       val test S
key ctype   val 0
key a       val test A
key t       val 10:02:03
key r       val test r
key         val 
key f       val 0
key c       val Test C1
key s       val test S1
key ctype   val 1
key a       val test A1
key t       val 00:02:22
key r       val test r
key         val 
key f       val 20
key c       val Test C
key s       val test S
key ctype   val 2
key a       val test A1
key t       val 00:02:03
key r       val test r

답변2

IFS여러 문자(또는 범위)를 구분 기호로 사용하지 마십시오. 의 각 문자는 IFS필드 구분 기호로 처리됩니다.

에서 man bash:

IFS 내부 필드 구분 기호는 확장 후 단어 분할 및 read 내장 명령을 사용하여 행을 단어로 분할하는 데 사용됩니다. 기본값은 입니다 <space><tab><newline>.

관련 정보