是否可以使用 sed 将某些正则表达式提取的命令替换为其输出?
例如,我有下一个文件:
2 + 2 = $$shell:echo 2 + 2 | bc$$ // and "some unescaped text' here
我如何将其转换为:
2 + 2 = 4 // and "some unescaped text' here
我发现可以提取命令并对其进行评估:
echo '2 + 2 = $$shell:echo 2 + 2 | bc$$ // and "some unescaped text' here | sed -e 's/.*\$\$shell:\(.*\)\$\$.*/\1/e'
4
但我不明白如何保留该行的其余部分。
答案1
你可以使用 Perl...
perl -pe 's[\$\$shell:(.*?)\$\$][ qx($1) =~ s/\n$//r ]ge' < inputfile
(qx
相当于命令替换,只不过它不会删除尾随换行符,因此=~ s/\n$//r
会删除尾随换行符。周围的内容s[][]ge
只是替换中使用 Perl 表达式的常见替换。)
答案2
丑陋,但是
$ echo '2 + 2 = $$shell:echo 2 + 2 | bc$$ // and some text here' |
sed -e 's/\(.*\)\$\$shell:\(.*\)\$\$\(.*\)/printf "%s%s%s\n" "\1" "$(sh -c "\2")" "\3"/e'
2 + 2 = 4 // and some text here