regex - Bash 正则表达式捕获

标签 regex linux bash macos

我想捕获与正则表达式匹配的字符串部分(请参阅下面的代码)。例如给出: 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

最佳答案

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

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

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

我使用您评论中的信息将您的代码扩展为 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 输出中。

关于regex - Bash 正则表达式捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48795154/

相关文章:

linux - 如何在Linux中循环中按值打印数组?

javascript - 用于骰子滚动系统和使用 javascript 捕获的正则表达式

linux - Linux 中 bin 目录应该放在哪里?

python - 如何用破折号替换所有空格、制表符、换行符、逗号和下划线?

Java Linux ServerSocket 没有做太多事情

c - 为什么将字符插入可执行二进制文件会导致它变为 "break"?

Bash:如何检查命令的返回值

linux - 在 bash/shell 脚本中使用 sudo 运行服务

regex - 在 Sublime Text 2 中搜索数字并对其进行一些数学评估

regex - 修剪超过 20 个字符