У меня есть следующее рабочее регулярное выражение, которое я тестировал в 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 $1)
local FUNC_NAMES=$(grep -o '^function [a-zA-Z0-9_]*' $1 | sed 's/function //')
echo "$FUNC_NAMES"
}
Большинство решений здесь работали для bash
, но это получает бонусный балл за то, что также работает в zsh
! Это моя последняя реализация cat utils.sh | grep -o "^function [a-zA-Z0-9_]*" | sed "s/function //"
Будьте осторожны с сайтами регулярных выражений: вам нужно знать, какое вкус регулярного выражения вы используете.
В вашем 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 \([^(]*\).*/\1/p' utils.sh
hello
get_aws_credentials
Проблема в том, что '\w' не является допустимым классом символов в регулярных выражениях bash.
Вместо этого вы можете использовать класс символов '[[:alnum:]]':
cat utils.sh | grep "^function\s\([[:alnum:]]+\)\(\)\s{"
В качестве альтернативы вы можете использовать класс символов '[[:alpha:]]', который будет соответствовать любой букве:
cat utils.sh | grep "^function\s\([[:alpha:]]+\)\(\)\s{"
Это была моя первая попытка исправить это, это не работает
Мне кажется, когда я указываю переключатель
-E
/--extended-regexp
:grep -E '^function\s(\w+)\(\)\s{$' utils.sh
.