sed:如何在嵌入式shell命令中使用记住的模式?

时间:2015-02-09 03:19:45

标签: shell sed makefile gnu-make command-substitution

我有一个GNU makefile,其中一条食谱线上写着:

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 class="math">$$\(.*\)$$</span>

<span style="font-size:100%">..SVG..</span>

其中..SVG..是执行shell命令curl -d "type=tex&q=\1" http://localhost:16000/返回的字符串,其中\1应该是先前记住的模式\(.*\)

问题:模式检测和shell执行都正常。但是,\1并未被先前记住的模式所取代。

PS:如果您希望sed使用-r选项,则makefile内的匹配如下:

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

2 个答案:

答案 0 :(得分:0)

问题是您在shell substitution内使用sed,显然不会将\1扩展到群组匹配。一种解决方案是使用sed的e命令,给出了一个很好的解释here

如果您需要示例,请参阅this的答案。

答案 1 :(得分:0)

虽然我认为有可能使用sed扩展名为GNU /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 :: Mechanize。)