如何利用BRE中的PCRE和命名捕获组,以便将变量导出回父环境?

问题描述 投票:0回答:1

是否可以从Bash脚本调用Perl等程序来执行带有命名捕获组的正则表达式,并将结果作为变量导出回父shell?

例如:

#!/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以外的任何东西,除了这个复杂的正则表达式的繁重之处。有没有办法轻松地使用其他语言来利用命名捕获组并将结果导出回父环境?

regex bash pcre capture-group named-captures
1个回答
0
投票

无法将变量从子流程导出到父流程。

最接近的是子进程,以bash shell可以评估的方式给出输出。例如。如果你的perl程序会输出

export LEGS=3
export ANIMAL='Lame boar'

然后你可以像这样从bash调用它:

eval $(perl animal.pl)

这些变量将插入您的环境中:

echo "$ANIMAL has $LEGS legs."

编辑:使用Ruby,假设定义了inputregex

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
")
© www.soinside.com 2019 - 2024. All rights reserved.