使用变量替换分割分隔字符串

使用变量替换分割分隔字符串

我有一个示例文件,其行由“#”分隔,包含 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 类似。

相关内容