2015-02-09 49 views
0

我有一個GNU makefile與配方線讀取之一:sed:如何在嵌入式shell命令中使用記憶模式?

sed -i 's|<span class="math">$$\(.*\)$$</span>|<span style="font-size:100%">'"$$(curl -d "type=tex&q=\1" http://localhost:16000/)"'</span>|g' $(NAME).a4.xhtml 

想法是通過<span style="font-size:100%">..SVG..</span>

其中..SVG..是通過執行外殼命令curl -d "type=tex&q=\1" http://localhost:16000/返回的字符串替換<span class="math">$$\(.*\)$$</span>

並且其中\1應該是先前記住的模式\(.*\)

問題:模式檢測和shell執行都能正常工作。然而,\1並未被先前記憶的模式所取代。

PS:如果一個人喜歡使用sed-r選項,makefile內匹配如下:

sed -i -r '[email protected]<span class="math">\$$(.*)\$$</span>@[email protected]' $(NAME).a4.xhtml 

回答

0

的問題是,你正在使用shell substitutionsed這顯然不會擴大\1到小組賽。一種解決方法是使用sed的e命令,給出了一個很好的解釋here

如果您需要一個例子,指的this答案。

0

雖然我認爲它可能與GNU sed/e擴展名關閉此,我可以虛心地建議你使用不同的工具嗎?

perl -i -MLWP::UserAgent -pe ' 
    BEGIN { $u = LWP::UserAgent->new(); } 
    s|<span class="math">\$\$\(.*?\)\$\$</span>| 
    sprintf q{<span style="font-size:100%%">%s</span>}, 
     $u->post("http://localhost:16000/", 
     [type=>"tex", q=>"$1"])->decoded_content() 
    |ge' $(NAME).a4.xhtml 

(希望有一個更簡單的Perl來POST方式,但只是抓住了我能找到,也許看WWW ::機械化代替如果有)。