如何在BASH中获取部分字符串

时间:2013-03-12 00:53:04

标签: bash

我的代码

FOO="aaa;bbb;ccc"

echo ${FOO##*;} # Result: ccc
echo ${FOO%%;*} # Result: aaa

如何从var FOO获得“bbb”?

echo ${FOO???*} # Result: bbb

谢谢

4 个答案:

答案 0 :(得分:1)

没有明确的操作员。此外,您无法嵌套这些运算符(请参阅Nested Shell Parameter Expansion

所以你应该为这份工作使用一些临时变量:

FOO="aaa;bbb;ccc"
tmp=${FOO%;*}
tmp=${tmp#*;}
echo $tmp

或者您应该将其转换为数组。

编辑归档,感谢您的评论。

答案 1 :(得分:1)

根据jejese's answer,您可以使用#%字拆分构造。

FOO="aaa;bbb;ccc"
split=${FOO%;*}
final=${split#*;}
echo $final

产生

bbb

或者您可以将IFS bash字段分隔符变量设置为分号,以根据字段拆分输入。这可能更容易使用,并允许您使用一行代码获取第二个字段的值。

FOO="aaa;bbb;ccc"
IFS=";" read field1 field2 field3 <<< "$FOO"
echo $field1 $field2 $field3

产生

aaa bbb ccc

答案 2 :(得分:0)

这并不完全一概而论,但提取3 ; - 分隔字段的中间可以通过以下方式完成:

$ shopt -s extglob
$ FOO=aaa;bbb;ccc
$ echo ${FOO//+(${FOO##*;}|${FOO%%;*}|;)}
bbb

将其细分为步骤可以更轻松地查看其工作原理:

$ C=${FOO##*;}     # ccc
$ A=${FOO%%;*}     # aaa
$ echo ${FOO//+($A|$C|;)}  # Removes every occurance of $A, $C, or ; from FOO

答案 3 :(得分:0)

另一种方式。将$ FOO分配给位置参数:

IFS=';'
set -- $FOO
echo  "$2"