我有一个示例文件,其行由“#”分隔,包含 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 -A
在 Zsh 中也可以工作,但数组索引是从 1 开始的。 Bash 的read -a
工作方式与 ksh 类似。