如何在短划线中标记字符串

时间:2014-06-06 09:29:45

标签: dash-shell

我从格式化为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?

3 个答案:

答案 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"'