用$和多行替换LaTeX

时间:2016-03-05 15:33:51

标签: regex bash sed latex

我想用sed替换像$some latex$

这样的东西
$$
some latex
$$

使用{% math %}some latex {% endmath %}

{% math %}
some latex
{% endmath %}

我尝试sed来解决这个问题,但是像

这样的命令
sed -e 's/\$\([^\$]\{1,\}\)\$/{% math %}\1{% endmath %}/g' filename

不适用于$some latex$而且我不知道如何处理多线路。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

您在这里遇到的唯一问题是捕获换行符或空白,这可以通过以下正则表达式解决。

正则表达式: (?:\$*)(\s*)some latex(\s*)(?:\$*)

使用的标志:

  • g进行全球搜索。

<强>解释

  • (?:\$*)(\s*)在引导$$$

  • 后捕获空白或换行符
  • (\s*)(?:\$*)在追踪$$$

  • 之前捕获空格或换行符

替换为: {% math %}\1some latex\2{% endmath %}

Regex101 Demo

答案 1 :(得分:1)

尝试使用sed:

sed -e ' /\$\$/{s/\$\$/{% math %}/;:a;N;/\$\$/!ba;s/\$\$/{% endmath %}/};s/^\(\$\)\(.*\)\(\$\)$/{% math %}\2{% endmath %}/' sourcefile

保留多行。

更新:

似乎有一个BSD(OS X?)sed issue with semi colons

它应该用新行代替它:

sed -e '
  /\$\$/ {
    s/\$\$/{% math %}/
      :a
      N
      /\$\$/!ba
      s/\$\$/{% endmath %}/;}
      s/^\(\$\)\(.*\)\(\$\)$/{% math %}\2{% endmath %}/
' sourcefile

我还更新了上一个s命令,以匹配评论中提到的$ \$ $这样的行。