无法将此正则表达式翻译成 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{"
我在 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{"