我在 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>
。