无法将此正则表达式翻译成 bash

Trouble translating this regex to bash

我在 regex101

中测试了以下工作正则表达式
^function\s(\w+)\(\)\s{$

对于以下测试字符串

function hello() {
  echo "Hello World"
}


function get_aws_credentials() {
  echo "Getting AWS Credentials
}

我的目标是获取该文件中定义的所有函数名称,这是我原来的正则表达式所做的,但不是 bash。

问题是它在 bash 或 zsh 中不起作用(不过我真的只关心 bash)。

我研究了它并看到了一些替代方案,例如将 \w+ 替换为 [[:alnum:]],但这也没有用。

这就是我测试它的方式:cat utils.sh | grep "^function\s(\w+)\(\)\s{$"

知道我在这里遗漏了什么吗?

谢谢!

这行得通吗?您是否正在尝试为每种文件类型创建通用正则表达式?

# Get all function names defined in a bash script file
# Usage: script.sh <script_file>

function get_functions() {
    local FUNC_NAME=$(basename )
    local FUNC_NAMES=$(grep -o '^function [a-zA-Z0-9_]*'  | sed 's/function //')
    echo "$FUNC_NAMES"
}

必须小心正则表达式网站:您需要知道您使用的正则表达式风格

您的 grep 可能有一个 -P 选项来启用 PCRE,所以试试这个:

grep -oP '^\s*(function\s+)?\K\w+(?=\s*\(\))'

根据您的输入,输出结果

hello
get_aws_credentials

关于模式的几点说明:

  • function 关键字是可选的
  • 函数名和括号之间可以有空格
  • 左大括号不必出现在同一行

使用grep

$ grep -Po '^function \K[^(]*' utils.sh
hello
get_aws_credentials

使用sed

$ sed -n s'/^function \([^(]*\).*//p' utils.sh
hello
get_aws_credentials

问题是 '\w' 在 bash 正则表达式中不是有效字符 class。

您可以使用“[[:alnum:]]”字符 class 代替:

cat utils.sh | grep "^function\s\([[:alnum:]]+\)\(\)\s{"

或者,您可以使用“[[:alpha:]]”字符 class,它将匹配任何字母:

cat utils.sh | grep "^function\s\([[:alpha:]]+\)\(\)\s{"