从 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 之外,我不需要使用任何其他东西,除了这个复杂的正则表达式的繁重工作。有没有办法轻松地使用另一种语言来利用命名捕获组并将结果导出回父环境?
无法将变量从子流程导出到父流程。
最接近这一点的是子进程,以 bash shell 可以评估的方式提供输出。 例如,如果你的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
")