我从格式化为firstfield|secondfield|thirdfield
的字符串中读取数据,在bash中我使用此构造来实现此目的:
i="firstfield|secondfield|thirdfield"
defaultIFS=$IFS
IFS="|"
set -- $i
arr=( $i )
IFS=$defaultIFS
FIRST=${arr[0]}
SECOND=${arr[1]}
THIRD=${arr[2]}
是否可以在不使用awk / sed等外部程序的情况下获得$ FIRST,$ SECOND和$ THIRD?
答案 0 :(得分:1)
您可以使用此功能,这也适用于bash
:
IFS='|' read FIRST SECOND THIRD dummy << EOF
$i
EOF
如果总有3个字段,则不需要虚拟变量。请注意,不需要重置IFS变量,因为它在read
命令的本地使用。
答案 1 :(得分:0)
使用-d选项剪切经常完成工作。
i="firstfield|secondfield|thirdfield"
echo $i | cut -d "|" -f1
-d "|"
表示使用分隔符&#34; |&#34;标记字符串,然后-f1
获取第一个字段,-f2
获取第二个字段,{{1}得到第三个字段。
答案 2 :(得分:0)
审核员的read
方法有效,但您也可以使用set
来设置位置参数($1
,$2
等)接近您可以在dash
中获得的数组。如果你巧妙地这样做(使用local
),它会非常有用。
这是一个小功能,它会在$STRING
上拆分$SEPARATOR
,然后为每个令牌逐出$CODE
。调用eval时设置变量$TOKEN
,因此您可以使用它。通过修改,您也可以为其提供令牌位置。 (如果您在$CODE
中执行任何高级操作,则可能还想重置$IFS
。)
# Usage: foreach_token SEPARATOR STRING CODE
foreach_token() {
local IFS="$1" STRING="$2" CODE="$3" TOKEN # get args
set -- $STRING # split $STRING on $IFS
for TOKEN; do # foreach $@
eval "$CODE"
done
}
像这样调用函数:
foreach_token "|" "firstfield|secondfield|thirdfield" 'echo "$TOKEN"'