如何用bash解析带空格的子串到shell变量?

时间:2017-03-08 20:17:56

标签: regex bash shell

我们拥有什么:

previous question中,建议使用以下模式识别与bash中的模式匹配的行,并将该行的部分提取到shell变量中:

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

但是,如果匹配的内容可以包含空格,则该代码不起作用。请考虑以下简化格式:

re='???'
line='[19:27:14] [Server thread/INFO]: Tester121 entered area ~ City - Leader Tester777 - (No PvP) ~'

if [[ $line =~ $re ]]; then
  time=${BASH_REMATCH[1]}
  player=${BASH_REMATCH[2]}
  area=${BASH_REMATCH[3]}
  #leader="Tester777"
  leader=${BASH_REMATCH[4]}
  #pvp="No PvP"
  pvp=${BASH_REMATCH[5]}
fi

re应该是什么?我是正则表达式的新手并尝试学习。

1 个答案:

答案 0 :(得分:2)

由于你提到“改变”,我假设你不应该同时匹配两种情况。如果我错了,请纠正我。

那么如下:

\[([[:digit:]:]+)\] \[Server thread/INFO\]: ([^[:space:]]+) entered area ~ ([^[:space:]]+) - Leader ([^[:space:]]+) - \(([^)]*)\) ~

您可以看到live preview here

  

中有空格

这里的关键是\(([^)]*)\)。它匹配括号内的所有内容。这当然意味着你不能拥有嵌套(近似)括号。