2017-03-08 34 views
0

我们得到了以下输入:解析成子shell变量在bash

[18:51:10] [Server thread/INFO]: Tester121 entered area ~ Wilderness - (PvP) ~ 

我们想解释输入,并定义不同的变量。

[$time] [Server thread/INFO]: $player entered area ~ $area - (PvP) ~ 

结果应该是:

time="18:51:10" 
player="Tester121" 
area="Wilderness" 

我是新来的StackOverflow,随意评论,这样我可以提高我怎么问的技巧。

+0

这实际上是[grok](https://github.com/jordansissel/grok)库的目标之一。 –

+0

嗯。可以争论http://stackoverflow.com/questions/19737675/shell-script-how-to-extract-string-using-regular-expressions作为重复,但虽然答案很好,但这是一个非常糟糕的问题。 –

+0

...而http://stackoverflow.com/questions/31709705/how-to-extract-parts-of-string-in-shell-script-into-variables是一个更好的问题,但几个答案做出假设这不适用于这种情况。 –

回答

0

[[ ]]中的=~运算符以POSIX ERE格式评估正则表达式,并将得到的匹配组分配给数组BASH_REMATCH

re='^\[([[:digit:]:]+)\] \[Server thread/INFO\]: ([^[:space:]]+) entered area ~ ([^[:space:]]+) - [(]PvP[)] ~' 
line='[18:51:10] [Server thread/INFO]: Tester121 entered area ~ Wilderness - (PvP) ~' 

if [[ $line =~ $re ]]; then 
    time=${BASH_REMATCH[1]} 
    player=${BASH_REMATCH[2]} 
    area=${BASH_REMATCH[3]} 
fi 
+0

那么如果我将输入定义为$ input,如何测试呢? Thx为你快速响应队友。 –

+0

没有看到你编辑的答案,将测试它:) –

+0

我添加了一些问题。愿你能再次帮助吗?我是新来的正则表达式,并试图学习它:) –