我有以下在 regex101 中測驗過的作業正則運算式
^function\s(\w )\(\)\s{$
對于以下測驗字串
function hello() {
echo "Hello World"
}
function get_aws_credentials() {
echo "Getting AWS Credentials
}
我的目標是獲取該檔案中定義的所有函式名稱,這就是我原來的正則運算式所做的,但不是在 bash 中。
問題是它在 bash 或 zsh 中不起作用(雖然我真的只關心 bash)。
我已經對其進行了研究并看到了一些替代方案,例如替換\w for [[:alnum:]],但這也不起作用。
這就是我測驗它的方式:cat utils.sh | grep "^function\s(\w )\(\)\s{$"
知道我在這里缺少什么嗎?
謝謝!
uj5u.com熱心網友回復:
這行得通嗎?或者您是否嘗試為每種檔案型別創建通用正則運算式?
# Get all function names defined in a bash script file
# Usage: script.sh <script_file>
function get_functions() {
local FUNC_NAME=$(basename $1)
local FUNC_NAMES=$(grep -o '^function [a-zA-Z0-9_]*' $1 | sed 's/function //')
echo "$FUNC_NAMES"
}
uj5u.com熱心網友回復:
必須小心正則運算式站點:您需要知道您使用的是什么風格的正則運算式。
你的 grep 可能有一個-P啟用 PCRE 的選項,所以試試這個:
grep -oP '^\s*(function\s )?\K\w (?=\s*\(\))'
給定您的輸入,此輸出
hello
get_aws_credentials
關于模式的幾點說明:
function關鍵字是可選的- 函式名和括號之間可以有空格
- 左大括號不必出現在同一行
uj5u.com熱心網友回復:
使用grep
$ grep -Po '^function \K[^(]*' utils.sh
hello
get_aws_credentials
使用sed
$ sed -n s'/^function \([^(]*\).*/\1/p' utils.sh
hello
get_aws_credentials
uj5u.com熱心網友回復:
問題是 '\w' 不是 bash 正則運算式中的有效字符類。
您可以改用 '[[:alnum:]]' 字符類:
cat utils.sh | grep "^function\s\([[:alnum:]] \)\(\)\s{"
或者,您可以使用 '[[:alpha:]]' 字符類,它可以匹配任何字母:
cat utils.sh | grep "^function\s\([[:alpha:]] \)\(\)\s{"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/476673.html
