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

Можно ли вызвать такую ​​программу, как 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 Ответ

0 голосов
/ 02 апреля 2019

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

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

export LEGS=3
export ANIMAL='Lame boar'

тогда вы можете вызвать его из bash, например:

eval $(perl animal.pl)

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

echo "$ANIMAL has $LEGS legs."

РЕДАКТИРОВАТЬ: С Ruby, если определены 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
")
...