在Perl正则表达式替换命令行中使用bash变量名作为匹配替换

gar*_*rys 3 regex bash shell perl command-line

我正在尝试用shell中与之匹配的bash变量的值替换由字符串中的字符分隔的子字符串。

到目前为止,我已经尝试过了,但没有成功:

varone="noob"
vartwo="trivial"
echo "my {varone} and {vartwo} question" | perl -pe 's|(.*){(\w+)}(.*)|${1}'$(echo "${'${2}'}")'${3}|g'
Run Code Online (Sandbox Code Playgroud)

但是我得到:

bash: ${'${2}'}: bad substitution
Run Code Online (Sandbox Code Playgroud)

关于如何执行此操作的任何想法?提前致谢!

Dav*_*oss 5

这里的主要问题是您需要使用export以便在子流程(如perl流程)中看到变量。

export varone="noob"
export vartwo="trivial"
echo "my {varone} and {vartwo} question" | perl -pe '...'
Run Code Online (Sandbox Code Playgroud)

您还需要知道使用%ENV哈希在Perl程序内访问shell变量。

因此,您的代码可以简化为:

export varone="noob"
export vartwo="trivial"
echo "my {varone} and {vartwo} question" | perl -pe 's|\{(\w+)}|$ENV{$1}|g'
Run Code Online (Sandbox Code Playgroud)

您可能考虑添加一个选项来检查未知变量。

export varone="noob"
export vartwo="trivial"
echo "my {varone} and {vartwo} question {varxxx}" | perl -pe 's|\{(\w+)}|$ENV{$1}//"UNKNOWN"|g'
Run Code Online (Sandbox Code Playgroud)

但是我建议为此选择合适的模板引擎


ike*_*ami 5

不要从外壳生成Perl代码!这并不容易

而不是生成代码,而是将值传递给脚本。该答案显示了将值传递给Perl单行代码的几种方法。在这里导出要插值的变量是最简单的。

export varone="noob"
export vartwo="trivial"
echo "my {varone} and {vartwo} question" |
   perl -pe's/\{(\w+)\}/$ENV{$1}/g'
Run Code Online (Sandbox Code Playgroud)

这也意味着您可以插值其他变量,例如PATH。如果那不好,则必须以某种方式检查变量名称是否合法。

export varone="noob"
export vartwo="trivial"
echo "my {varone} and {vartwo} question" |
   perl -pe's/\{(varone|vartwo)\}/$ENV{$1}/g'
Run Code Online (Sandbox Code Playgroud)