使用 sed 将命令替换为行中的结果(命令输出)

使用 sed 将命令替换为行中的结果(命令输出)

是否可以使用 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

相关内容