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>
.