Как я могу использовать PCRE и именованные группы захвата из Bash, чтобы я мог экспортировать переменные обратно в родительскую среду?

Можно ли вызвать такую ​​программу, как Perl, из скрипта Bash, чтобы выполнить регулярное выражение с именованными группами захвата и экспортировать результаты в виде переменных обратно в родительскую оболочку?

Например:

#!/bin/bash

input="a small box"
regex="a (?P<size>\w+) box"

perl -e "
my \$str = \"$input\";

if ( \$str =~ /$regex/ ) {
   # Do a thing...
}
"

# Illustrative purposes only
echo $size

Ожидаемый результат будет small,

Это не должно быть сделано специально с Perl. Я просто хочу знать, можно ли это сделать и продемонстрировать.

У меня есть несколько тысяч файлов для анализа, и мне нужно создать очень большое и сложное регулярное выражение для обработки их содержимого. Хотя это можно сделать с помощью других инструментов, таких как pcregrep или же =~ с пронумерованными группами захвата я бы предпочел использовать именованные группы захвата для ясности.

Я не чувствую, что мне нужно использовать что-то кроме Bash, кроме тяжелой работы с этим сложным регулярным выражением. Есть ли способ легко перейти на другой язык, чтобы воспользоваться именованными группами захвата и экспортировать результат обратно в родительскую среду?

1 ответ

Невозможно экспортировать переменную из подпроцесса в родительский процесс.

Наиболее близким к этому будет дочерний процесс, выдающий выходные данные способом, который может оценить оболочка bash. Например, если ваша Perl-программа выдаст

export LEGS=3
export ANIMAL='Lame boar'

тогда вы можете вызвать его из bash как это:

eval $(perl animal.pl)

и эти переменные будут вставлены в вашу среду:

echo "$ANIMAL has $LEGS legs."

РЕДАКТИРОВАТЬ: с Руби, предполагая input а также regex определены,

eval $(ruby -r shellwords -e "
if (match = ENV['input'].match(ENV['regex']))
  match.names.each do |name|
    puts %{export #{name}=#{Shellwords::shellescape(match[name])}}
  end
end
")
Другие вопросы по тегам