【问题标题】:How to parse substrings with spaces into shell variables in bash?如何将带有空格的子字符串解析为bash中的shell变量?
【发布时间】:2017-03-08 20:17:56
【问题描述】:

我们拥有的:

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 应该是什么?我是正则表达式的新手并尝试学习。

【问题讨论】:

  • 最好展示您尝试过的内容 - 所以不仅仅是 re=??? 占位符,而是您自己尝试扩展正则表达式。
  • ...顺便说一句,我尝试更新标题以区分这个问题与上一个问题有何不同。

标签: regex bash shell


【解决方案1】:

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

那么像这样的东西呢:

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

你可以看到live preview here

里面有空格

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

【讨论】:

  • 该测试人员使用 PCRE 语法,但 bash =~ 运算符仅使用 ERE。一个特别的区别是 ERE 不支持使用 *? 来使 * 的行为不贪婪。
  • @CharlesDuffy 哦,没想到!
  • 经过编辑,这对我来说看起来不错——就像在 bash 中使用 [[ $line =~ $re ]] 成功测试一样。
猜你喜欢
  • 2017-07-29
  • 2021-12-02
  • 2016-07-29
  • 1970-01-01
  • 2018-04-07
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多