【问题标题】:Bash Regex CaptureBash 正则表达式捕获
【发布时间】:2018-02-14 19:53:31
【问题描述】:

我想捕获与正则表达式匹配的部分字符串(参见下面的代码)。例如给定:apply plugin: 'java' 我想捕获java

我整理了以下正则表达式。当我执行下面的代码(在 Linux 或 Mac OS 上)时,找到了一个匹配项,但 BASH_REMATCH 数组为空(即长度为零)。

有人知道正则表达式和/或其应用程序有什么问题吗?

regex="^[[:space:]]*apply[[:space:]]*plugin:[[:space:]]*'([[:alpha:]]+)'[[:space:]]*$"

if [[ "$line" =~ $regex ]]; then
  echo "Match count is ${#BASH_REMATCH[@]}."
  echo ${BASH_REMATCH[1]}
else
  echo "No match."
fi

【问题讨论】:

标签: regex linux bash macos


【解决方案1】:

我无法重现 macOS 上发布的内容。您可能有调试陷阱或类似设置。

为了帮助调试,请编辑您的问题以包括:

  1. 您运行的完整脚本(即包括填充 $line 的任何内容)
  2. 您用来运行它的完整命令,以及完整的输出
  3. bash xtrace (-x) 输出

我使用来自您的 cmets 的信息将您的代码扩展为 MCVE:

$ cat myfile
regex="^[[:space:]]*apply[[:space:]]*plugin:[[:space:]]*'([[:alpha:]]+)'[[:space:]]*$"

line="apply plugin: 'java'"

if [[ "$line" =~ $regex ]]; then
  echo "Match count is ${#BASH_REMATCH[@]}."
  echo ${BASH_REMATCH[1]}
else
  echo "No match."
fi

然后我像这样运行它并得到预期的输出:

$ bash myfile
Match count is 2.
java

这是带有调试信息的输出:

$ bash -x myfile
+ regex='^[[:space:]]*apply[[:space:]]*plugin:[[:space:]]*'\''([[:alpha:]]+)'\''[[:space:]]*$'
+ line='apply plugin: '\''java'\'''
+ [[ apply plugin: 'java' =~ ^[[:space:]]*apply[[:space:]]*plugin:[[:space:]]*'([[:alpha:]]+)'[[:space:]]*$ ]]
+ echo 'Match count is 2.'
Match count is 2.
+ echo java
java

这是系统信息:

$ uname -a && bash --version
Darwin hostname 17.4.0 Darwin Kernel Version 17.4.0: Sun Dec 17 09:19:54 PST 2017; root:xnu-4570.41.2~1/RELEASE_X86_64 x86_64
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
Copyright (C) 2007 Free Software Foundation, Inc.

我可以添加重现相同的结果,例如将trap '[[ a =~ b ]]' DEBUG 添加到脚本中。如果您正在执行类似的操作,它将显示在 -x 输出中。

【讨论】:

  • 虽然这确实是一个扩展评论,但为提供的详细调试帮助 +1。
猜你喜欢
  • 1970-01-01
  • 2021-02-24
  • 2014-01-02
  • 1970-01-01
  • 2019-08-06
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多