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)
关于如何执行此操作的任何想法?提前致谢!
这里的主要问题是您需要使用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)
但是我建议为此选择合适的模板引擎。
不要从外壳生成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)