IFS分裂问题

IFS分裂问题

我在 bash shell 脚本的开头使用以下行:

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>

相关内容