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

如何使用sed将TeX中的$$blah$$转换为\begin{equation}blah\end{equation},sed,Sed,我有包含以下表格条目的文件: $$ y = x^2 $$ 我正在寻找一种方法(特别是使用sed)将它们转换为: \begin{equation} y = x^2 \end{equation} 解决方案不应依赖于方程式的形式(也可能跨越多行),也不应依赖于开头$$之前或结尾$$之后的文本。 谢谢您的帮助。我无法帮助您使用sed,但是这个awk应该可以: awk '/\$\$/ && !f {$0="\\begin{equation}";f=1} /\$\$/ &&

我有包含以下表格条目的文件:

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

\begin{equation}
y = x^2
\end{equation}
解决方案不应依赖于方程式的形式(也可能跨越多行),也不应依赖于开头$$之前或结尾$$之后的文本。
谢谢您的帮助。

我无法帮助您使用
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

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”。如果是,则替换结束标记;否则,替换开始标记。在任何一种情况下,将替换的标签存储在保留空间中,以便下次检查

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
  }
'
这可能适用于您(GNU-sed):


用所需字符串填充保持空间。遇到标记时,打印第一行,然后交换字符串,以等待下一个标记。

效果很好,但是,尽管我知道每个命令的作用,但我太厚了,无法理解它是如何工作的。你能补充一些解释吗?@user3856370这样的解释够了吗?你也不胖
sed
很奇怪而且很有限!为什么都挤在一条线上?尽管如此,我还是比我的更喜欢这个+1@ooga除了我在命令行上编写和测试解决方案的方式之外,没有其他特殊原因。
 sed -r '1{x;s/^/\\begin{equation}\n\\end{equation}/;x};/\$\$/{g;P;s/(.*)\n(.*)/\2\n\1/;h;d}' file