Проблема с переводом этого регулярного выражения в 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{$"

Есть идеи, что мне здесь не хватает?

Спасибо!

Мне кажется, когда я указываю переключатель -E/--extended-regexp: grep -E '^function\s(\w+)\(\)\s{$' utils.sh.

Julia 17.05.2022 21:17
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
1
37
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Будет ли это работать или вы пытаетесь создать универсальное регулярное выражение для каждого типа файлов?

# 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 //"

A Campos 17.05.2022 23:08

Будьте осторожны с сайтами регулярных выражений: вам нужно знать, какое вкус регулярного выражения вы используете.

В вашем 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{"

Это была моя первая попытка исправить это, это не работает

A Campos 17.05.2022 23:11

Другие вопросы по теме