1

我从格式为 的字符串中读取数据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?

4

3 回答 3

1

您可以使用它,它也适用于bash

IFS='|' read FIRST SECOND THIRD dummy << EOF
$i
EOF

如果总是正好有 3 个字段,则不需要虚拟变量。请注意,无需重置 IFS 变量,因为它在read命令的本地使用。

于 2014-06-22T05:42:37.237 回答
0

使用 -d 选项进行剪切通常可以完成这项工作。

i="firstfield|secondfield|thirdfield"  
echo $i | cut -d "|" -f1

-d "|"表示用分隔符“|”标记字符串,然后-f1获取第一个字段,-f2获取第二个字段,-f3获取第三个字段。

于 2014-06-22T05:46:42.530 回答
0

Scrutinizer 的read方法有效,但您也可以使用它set来设置位置参数($1$2),它与您可以进入的数组差不多dash。如果你巧妙地做到这一点(使用local),它会非常有用。

这是一个小函数,它会拆分然后$STRING对每个令牌进行评估。该变量是在调用 eval 时设置的,因此您可以使用它。通过修改,您也可以为其指定令牌位置。(如果你做了任何高级的事情,你可能也想重置。)$SEPARATOR$CODE$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"'
于 2014-07-23T23:40:10.237 回答