Shell

使用 sed 將命令替換為行中的結果(命令輸出)

  • September 4, 2019

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

但我不明白如何保留線路的其餘部分。

你可以使用 Perl…

perl -pe 's[\$\$shell:(.*?)\$\$][ qx($1) =~ s/\n$//r ]ge' < inputfile

(qx等效於命令替換,除了它不刪除尾隨換行符,所以它會這樣做=~ s/\n$//r。周圍s[][]ge只是替換中的 Perl 表達式的常用替換。)

醜,但是

$ 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

引用自:https://unix.stackexchange.com/questions/538128