Как я могу использовать 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
")