0

是否可以从 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 以外的任何东西。有没有办法轻松地使用另一种语言来利用命名捕获组并将结果导出回父环境?

4

1 回答 1

1

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

最接近这一点的是子进程以 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
")
于 2019-04-02T06:01:22.530 回答