如何使用sed将TeX中的$$ blah $$转换为\ begin {equation} blah \ end {equation}

时间:2014-07-19 17:25:49

标签: sed

我的文件包含以下格式:

$$
y = x^2
$$

我正在寻找一种方法(特别是使用sed)将它们转换为:

\begin{equation}
y = x^2
\end{equation}

解决方案不应该依赖于等式的形式(也可能跨越多条线),也不应该依赖于开头$$之前或接近$$之后的文本。 谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

sed '
  /^\$\$$/ {
    x
    s/begin/&/
    t use_end_tag
    s/^.*$/\\begin{equation}/
    h
    b
    : use_end_tag
    s/^.*$/\\end{equation}/
    h
  }
'

说明:

sed维护两个缓冲区:模式空间(pspace)和保留空间(hspace)。它以循环方式运行,在每个循环中它读取一行并执行该行的脚本。 pspace通常在每个循环结束时自动打印(除非使用-n选项),然后在下一个循环之前删除。 hspace在循环之间保存其内容。

脚本的想法是,每当看到$$时,首先检查hspace以查看它是否包含单词" begin"。如果是,则替换结束标记;否则替换begin标签。在任何一种情况下,都将替换标签存储在保留空间中,以便下次检查。

sed '
  /^\$\$$/ {                   # if line contains only $$
    x                          # exchange pspace and hspace
    s/begin/&/                 # see if "begin" was in hspace
    t use_end_tag              # if it was, goto use_end_tag
    s/^.*$/\\begin{equation}/  # replace pspace with \begin{equation}
    h                          # set hspace to contents of pspace
    b                          # start next cycle after auto-printing
    : use_end_tag
    s/^.*$/\\end{equation}/    # replace pspace with \end{equation}
    h                          # set hspace to contents of pspace
  }
'

答案 1 :(得分:1)

这可能适合你(GNU sed):

 sed -r '1{x;s/^/\\begin{equation}\n\\end{equation}/;x};/\$\$/{g;P;s/(.*)\n(.*)/\2\n\1/;h;d}' file

使用所需的字符串填充保留空间。在遇到标记时打印第一行,然后交换字符串以预期下一个标记。

答案 2 :(得分:0)

我无法帮助您sed,但awk应该这样做:

awk '/\$\$/ && !f {$0="\\begin{equation}";f=1} /\$\$/ && f {$0="\\end{equation}";f=0}1' file
\begin{equation}
y = x^2
\end{equation}

如果不重复,则不需要f=0